## [1] "C:/Users/kadwolf/OneDrive - UGent/UGent-PC/Kadwolf/Documents/00_SPINCITY/05_onderzoek/03_colour_analysis/spin_city_colour_results_V1"

analysis data collected in 2021

SAMPLING INFO CONTAINS 85 sampling sites: - 2 repeated samplings because the spiders were not frozen immediately: P05SR_R and P04SG_R (i remove them in the colour analysis as it is then the most randomized scheme and otherwise it will increase sampling sizes of location P05SR_R and P04SG_R with 20 spiders each) - 1 extra location in Brussels P20SE (RBINS) => i indicated it for now as High Medium urbanisation category (check with urb radius) - 1 extra location in Ghent, P01SE, but we did not collect spiders

to conclude : all 81 typical speedy sampling sites were sampled; at P09SY no A. diadematus found

=> for this analysis i remove location P05SR_R P04SG_R P20SE:

##  [1] "P01SG"   "P01SR"   "P01SY"   "P02SG"   "P02SR"   "P02SY"   "P03SG"  
##  [8] "P03SR"   "P03SY"   "P04SG_R" "P04SG"   "P04SR"   "P04SY"   "P05SG"  
## [15] "P05SR_R" "P05SR"   "P05SY"   "P06SG"   "P06SR"   "P06SY"   "P07SG"  
## [22] "P07SR"   "P07SY"   "P08SG"   "P08SR"   "P08SY"   "P09SG"   "P09SR"  
## [29] "P10SG"   "P10SR"   "P10SY"   "P11SG"   "P11SR"   "P11SY"   "P12SG"  
## [36] "P12SR"   "P12SY"   "P13SG"   "P13SR"   "P13SY"   "P14SG"   "P14SR"  
## [43] "P14SY"   "P15SG"   "P15SR"   "P15SY"   "P16SG"   "P16SR"   "P16SY"  
## [50] "P17SG"   "P17SR"   "P17SY"   "P18SG"   "P18SR"   "P18SY"   "P19SG"  
## [57] "P19SR"   "P19SY"   "P20SE"   "P20SG"   "P20SR"   "P20SY"   "P21SG"  
## [64] "P21SR"   "P21SY"   "P22SG"   "P22SR"   "P22SY"   "P23SG"   "P23SR"  
## [71] "P23SY"   "P24SG"   "P24SR"   "P24SY"   "P25SG"   "P25SR"   "P25SY"  
## [78] "P26SG"   "P26SR"   "P26SY"   "P27SG"   "P27SR"   "P27SY"

preparation of dataset:

##  [1] "spiderID"           "a"                  "r"                 
##  [4] "col_corr_leafdark"  "col_corr_leaflight" "col_corr_cross"    
##  [7] "col_corr_abdbri"    "spider_length"      "abdomen_length"    
## [10] "cross_length"       "cross_width"        "abdomen_area"      
## [13] "project_year"       "location"           "plotid"            
## [16] "city"               "region"             "U_landscape"       
## [19] "U_local"            "urb_cat"            "sampling_date"     
## [22] "project_detail"     "remark_sampling"    "x"                 
## [25] "y"
## spc_tbl_ [1,383 × 25] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ spiderID          : chr [1:1383] "SC21P01SG01" "SC21P01SG02" "SC21P01SG03" "SC21P01SG04" ...
##  $ a                 : num [1:1383] 8.96 8.61 9.03 9.3 9.82 ...
##  $ r                 : num [1:1383] 0.0122 0.0108 0.0119 0.0121 0.0111 ...
##  $ col_corr_leafdark : num [1:1383] 12.8 17.4 12.3 21.2 25.9 ...
##  $ col_corr_leaflight: num [1:1383] 20.5 21.9 15 31.6 29 ...
##  $ col_corr_cross    : num [1:1383] 60.1 49.5 75.6 61.1 47.1 ...
##  $ col_corr_abdbri   : num [1:1383] 19.4 22.1 18.9 29.1 38.4 ...
##  $ spider_length     : num [1:1383] 13.3 16.3 14.6 13.3 18 ...
##  $ abdomen_length    : num [1:1383] 10.7 13.5 12.7 11.8 15.9 ...
##  $ cross_length      : num [1:1383] 5.38 6.63 5.22 5.11 7.45 ...
##  $ cross_width       : num [1:1383] 4.29 4.94 5.01 3.3 5.24 ...
##  $ abdomen_area      : num [1:1383] 80.7 128.7 104.3 91.2 164.7 ...
##  $ project_year      : chr [1:1383] "SC21" "SC21" "SC21" "SC21" ...
##  $ location          : chr [1:1383] "P01SG" "P01SG" "P01SG" "P01SG" ...
##  $ plotid            : chr [1:1383] "P01" "P01" "P01" "P01" ...
##  $ city              : chr [1:1383] "Gent" "Gent" "Gent" "Gent" ...
##  $ region            : chr [1:1383] "Gent" "Gent" "Gent" "Gent" ...
##  $ U_landscape       : chr [1:1383] "HIGH" "HIGH" "HIGH" "HIGH" ...
##  $ U_local           : chr [1:1383] "LOW" "LOW" "LOW" "LOW" ...
##  $ urb_cat           : chr [1:1383] "HIGHLOW" "HIGHLOW" "HIGHLOW" "HIGHLOW" ...
##  $ sampling_date     : chr [1:1383] "27/09/2021" "27/09/2021" "27/09/2021" "27/09/2021" ...
##  $ project_detail    : chr [1:1383] "staalname2021" "staalname2021" "staalname2021" "staalname2021" ...
##  $ remark_sampling   : chr [1:1383] "met bram" "met bram" "met bram" "met bram" ...
##  $ x                 : chr [1:1383] "51.049036" "51.049036" "51.049036" "51.049036" ...
##  $ y                 : chr [1:1383] "3.696775" "3.696775" "3.696775" "3.696775" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   spiderID = col_character(),
##   ..   a = col_double(),
##   ..   r = col_double(),
##   ..   col_corr_leafdark = col_double(),
##   ..   col_corr_leaflight = col_double(),
##   ..   col_corr_cross = col_double(),
##   ..   col_corr_abdbri = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
##  [1] "P01SG" "P01SR" "P01SY" "P02SG" "P02SR" "P02SY" "P03SG" "P03SR" "P03SY"
## [10] "P04SG" "P04SR" "P04SY" "P05SG" "P05SR" "P05SY" "P06SG" "P06SR" "P06SY"
## [19] "P07SG" "P07SR" "P07SY" "P08SG" "P08SR" "P08SY" "P09SG" "P09SR" "P10SG"
## [28] "P10SR" "P10SY" "P11SG" "P11SR" "P11SY" "P12SG" "P12SR" "P12SY" "P13SG"
## [37] "P13SR" "P13SY" "P14SG" "P14SR" "P14SY" "P15SG" "P15SR" "P15SY" "P16SG"
## [46] "P16SR" "P16SY" "P17SG" "P17SR" "P17SY" "P18SG" "P18SR" "P18SY" "P19SG"
## [55] "P19SR" "P19SY" "P20SG" "P20SR" "P20SY" "P21SG" "P21SR" "P21SY" "P22SG"
## [64] "P22SR" "P22SY" "P23SG" "P23SR" "P23SY" "P24SG" "P24SR" "P24SY" "P25SG"
## [73] "P25SR" "P25SY" "P26SG" "P26SR" "P26SY" "P27SG" "P27SR" "P27SY"
## [1] "HIGH"   "LOW"    "MEDIUM"
## [1] "HIGH"   "LOW"    "MEDIUM"
## [1] "HIGHHIGH"     "HIGHLOW"      "HIGHMEDIUM"   "LOWHIGH"      "LOWLOW"      
## [6] "LOWMEDIUM"    "MEDIUMHIGH"   "MEDIUMLOW"    "MEDIUMMEDIUM"
## Warning: package 'chron' was built under R version 4.3.2
## [1] TRUE

exploration of data:

## Rows: 1,383
## Columns: 26
## $ spiderID           <fct> SC21P01SG01, SC21P01SG02, SC21P01SG03, SC21P01SG04,…
## $ a                  <dbl> 8.959275, 8.610263, 9.033979, 9.297104, 9.822551, 6…
## $ r                  <dbl> 0.01222899, 0.01077165, 0.01193368, 0.01212227, 0.0…
## $ col_corr_leafdark  <dbl> 12.772954, 17.404049, 12.271638, 21.200340, 25.9076…
## $ col_corr_leaflight <dbl> 20.49506, 21.90025, 15.03173, 31.62829, 28.96291, 1…
## $ col_corr_cross     <dbl> 60.11953, 49.47924, 75.57975, 61.11121, 47.12496, 4…
## $ col_corr_abdbri    <dbl> 19.44479, 22.07536, 18.89618, 29.11122, 38.44574, 1…
## $ spider_length      <dbl> 13.346, 16.261, 14.619, 13.343, 17.953, 16.827, 15.…
## $ abdomen_length     <dbl> 10.676, 13.489, 12.739, 11.823, 15.852, 13.401, 12.…
## $ cross_length       <dbl> 5.378, 6.629, 5.224, 5.113, 7.448, 5.771, 4.982, 5.…
## $ cross_width        <dbl> 4.291, 4.939, 5.013, 3.297, 5.242, 3.774, 3.649, 5.…
## $ abdomen_area       <dbl> 80.699, 128.657, 104.282, 91.243, 164.744, 118.947,…
## $ project_year       <fct> SC21, SC21, SC21, SC21, SC21, SC21, SC21, SC21, SC2…
## $ location           <fct> P01SG, P01SG, P01SG, P01SG, P01SG, P01SG, P01SG, P0…
## $ plotid             <fct> P01, P01, P01, P01, P01, P01, P01, P01, P01, P01, P…
## $ city               <fct> Gent, Gent, Gent, Gent, Gent, Gent, Gent, Gent, Gen…
## $ region             <fct> Gent, Gent, Gent, Gent, Gent, Gent, Gent, Gent, Gen…
## $ U_landscape        <fct> HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIG…
## $ U_local            <fct> LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, L…
## $ urb_cat            <fct> HIGHLOW, HIGHLOW, HIGHLOW, HIGHLOW, HIGHLOW, HIGHLO…
## $ sampling_date      <date> 2021-09-27, 2021-09-27, 2021-09-27, 2021-09-27, 20…
## $ project_detail     <chr> "staalname2021", "staalname2021", "staalname2021", …
## $ remark_sampling    <chr> "met bram", "met bram", "met bram", "met bram", "me…
## $ x                  <chr> "51.049036", "51.049036", "51.049036", "51.049036",…
## $ y                  <chr> "3.696775", "3.696775", "3.696775", "3.696775", "3.…
## $ day                <dbl> 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 2…
## [1] "cross_length"    "cross_width"     "remark_sampling"

plotid U_landscape LOW MEDIUM HIGH
P01 HIGH 20 18 20
P02 HIGH 22 17 20
P03 HIGH 21 11 19
P04 MEDIUM 20 20 17
P05 MEDIUM 8 22 20
P06 MEDIUM 20 20 16
P07 LOW 14 19 24
P08 LOW 19 17 19
P09 LOW 19 NA 20
P10 HIGH 20 12 17
P11 HIGH 20 20 14
P12 HIGH 20 20 21
P13 MEDIUM 12 20 19
P14 MEDIUM 12 9 20
P15 MEDIUM 10 18 18
P16 LOW 19 1 20
P17 LOW 17 5 21
P18 LOW 18 12 14
P19 HIGH 20 17 20
P20 HIGH 14 9 15
P21 HIGH 19 19 19
P22 MEDIUM 20 15 22
P23 MEDIUM 20 21 21
P24 MEDIUM 20 19 22
P25 LOW 16 2 15
P26 LOW 8 19 17
P27 LOW 22 21 20
U_landscape LOW MEDIUM HIGH
LOW 152 96 170
MEDIUM 142 164 175
HIGH 176 143 165

remove those individuals so we get dataset : data_bz to analyse the morphological measurements

dataset data_bz : body size measurements

first exploration then test each morphological trait via univariate mixed models

length

always the same 3 type of visualisations are repeated

abdomen length

abdomen area

cross length

cross width

maybe better to scale the cross length to the proportion it takes of the abdomen or of the spider visualised here

corrected crosslength

## Warning: package 'ggpubr' was built under R version 4.3.2

as total spider length was less accurate to measure, positioning spider plays a role, abdomen corrected is here most suitable i think

both show rougly the same trends

###statistics

statistics make use of glmmTMB multiple observation for each subplotid

first check correlation of sampling day with the body size meaurements. However only very minor correlation present

## Warning: package 'corrplot' was built under R version 4.3.2

that’s why i don’t include day (scaled sampling day) in the statistical models

statistics spider length

## Warning: package 'DHARMa' was built under R version 4.3.3
## Warning: package 'glmmTMB' was built under R version 4.3.3
## Warning: package 'car' was built under R version 4.3.2
## Warning: package 'carData' was built under R version 4.3.2
## Warning: package 'emmeans' was built under R version 4.3.3
## Warning: package 'performance' was built under R version 4.3.3
## Warning: package 'effects' was built under R version 4.3.2
##  Family: gaussian  ( identity )
## Formula:          spider_length ~ U_landscape + U_local + (1 | plotid/location)
## Data: data_bz
## 
##      AIC      BIC   logLik deviance df.resid 
##   5565.1   5606.9  -2774.5   5549.1     1368 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept) 0.3814   0.6176  
##  plotid          (Intercept) 0.3430   0.5857  
##  Residual                    3.0320   1.7413  
## Number of obs: 1376, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2): 3.03 
## 
## Conditional model:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       13.165865   0.272824   48.26   <2e-16 ***
## U_landscapeMEDIUM -0.342033   0.347725   -0.98    0.325    
## U_landscapeHIGH    0.545934   0.347465    1.57    0.116    
## U_localMEDIUM      0.006546   0.212754    0.03    0.975    
## U_localHIGH        0.234686   0.202906    1.16    0.247    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: spider_length
##                 Chisq Df Pr(>Chisq)    
## (Intercept) 2328.8124  1    < 2e-16 ***
## U_landscape    6.8145  2    0.03313 *  
## U_local        1.7082  2    0.42567    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

##  contrast      estimate    SE   df t.ratio p.value
##  LOW - MEDIUM     0.342 0.348 1368   0.984  0.5873
##  LOW - HIGH      -0.546 0.347 1368  -1.571  0.2585
##  MEDIUM - HIGH   -0.888 0.343 1368  -2.588  0.0264
## 
## Results are averaged over the levels of: U_local 
## P value adjustment: tukey method for comparing a family of 3 estimates

random factor: (1|plotid/location) : plotid (P01-P27) and location (P01SG, .., P27SR) fixed effects: urbanisation levels at landscape and local scale : U_landscape and U_local

Result: spider length : spiders become bigger with increasing urbanisation level at landscape scale, but only difference between medium and high urbanised landscapes are significant

abdomen length - statistics

spider length sometimes difficult to accurately measure. maybe abdomen length is somehow measured more comparable

##  Family: gaussian  ( identity )
## Formula:          
## abdomen_length ~ U_landscape + U_local + (1 | plotid/location)
## Data: data_bz
## 
##      AIC      BIC   logLik deviance df.resid 
##   5503.0   5544.8  -2743.5   5487.0     1368 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept) 0.4397   0.6631  
##  plotid          (Intercept) 0.3122   0.5588  
##  Residual                    2.8823   1.6977  
## Number of obs: 1376, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2): 2.88 
## 
## Conditional model:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       10.92572    0.27230   40.12   <2e-16 ***
## U_landscapeMEDIUM -0.47067    0.34337   -1.37    0.170    
## U_landscapeHIGH    0.14240    0.34312    0.42    0.678    
## U_localMEDIUM      0.09656    0.22149    0.44    0.663    
## U_localHIGH        0.21502    0.21183    1.02    0.310    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: abdomen_length
##                 Chisq Df Pr(>Chisq)    
## (Intercept) 1609.9318  1     <2e-16 ***
## U_landscape    3.5815  2     0.1668    
## U_local        1.0348  2     0.5961    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

###abdomen area - statistics abdomen area as a potential measure of fecundity

##  Family: gaussian  ( identity )
## Formula:          abdomen_area ~ U_landscape + U_local + (1 | plotid/location)
## Data: data_bz
## 
##      AIC      BIC   logLik deviance df.resid 
##  12901.4  12943.2  -6442.7  12885.4     1368 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept)  97.46    9.872  
##  plotid          (Intercept)  77.09    8.780  
##  Residual                    621.92   24.938  
## Number of obs: 1376, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2):  622 
## 
## Conditional model:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         80.470      4.152  19.380   <2e-16 ***
## U_landscapeMEDIUM   -7.313      5.273  -1.387    0.165    
## U_landscapeHIGH      2.330      5.269   0.442    0.658    
## U_localMEDIUM        1.097      3.285   0.334    0.738    
## U_localHIGH          2.553      3.142   0.812    0.417    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: abdomen_area
##                Chisq Df Pr(>Chisq)    
## (Intercept) 375.5914  1     <2e-16 ***
## U_landscape   3.7287  2     0.1550    
## U_local       0.6651  2     0.7171    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

no differences in abdomen area

colour

check for strange values although the colour correction is executed. In quite a lot of pictures the grey scale is blurry and in some also the spider

###exploration

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.905  18.885  21.826  22.727  25.900  77.857

SC21P10SR15 => spider is pale but not that pale also not that pale : SC21P24SR05, SC21P22SR18 SC21P21SG12 => is not that dark spider

dataset for the colour analysis : data_col data_col contain 1380 spiders! (instead of 1383 spider, data_bz contains 1376 spiders)

###correlation no trends with day (sampling day). However, there is a strong positive correlation between abdomen brightness and leafdark, abdomen brightness and leaflight => correlation: the paler the spider also the paler the leafdark and leaflight

correlation: the paler the leafdark also the paler the leaflight

no correlation with colour of the cross these values are still strange although correction was applied in the same way as for col_corr_leafdark and col_corr_leafdark => maybe only focus on % reflectance of abdomen !

Again 3 type of visualisation graphs and after that the statistical test

comparison data_col and filtered dataset data_col_filt

the same dataset but now with some more strict filtering of extremes (probably due to photo quality) so everything under 10 and everything above 35 => dataset : data_col_filt: contains 1337 observations(=spiders)

## [1] 1379   27
## [1] 1337   27

col_filt exploration

the same 3 graph visualisations for the filtered dataset + violin

###statistics ###statistics - data_col statistics on abdomen brightness: now expressed as reflectance

##  Family: gaussian  ( identity )
## Formula:          
## col_corr_abdbri ~ U_landscape * U_local + (1 | plotid/location)
## Data: data_col
## 
##      AIC      BIC   logLik deviance df.resid 
##   8580.3   8643.1  -4278.2   8556.3     1367 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept)  1.219   1.104   
##  plotid          (Intercept)  2.089   1.445   
##  Residual                    27.437   5.238   
## Number of obs: 1379, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2): 27.4 
## 
## Conditional model:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      23.3474     0.7447  31.354   <2e-16 ***
## U_landscapeMEDIUM                -0.0595     1.0613  -0.056   0.9553    
## U_landscapeHIGH                  -1.8578     1.0393  -1.788   0.0738 .  
## U_localMEDIUM                    -0.6655     0.9286  -0.717   0.4736    
## U_localHIGH                      -0.9605     0.7883  -1.218   0.2231    
## U_landscapeMEDIUM:U_localMEDIUM  -0.5364     1.2295  -0.436   0.6626    
## U_landscapeHIGH:U_localMEDIUM     2.6753     1.2206   2.192   0.0284 *  
## U_landscapeMEDIUM:U_localHIGH     0.3806     1.1208   0.340   0.7342    
## U_landscapeHIGH:U_localHIGH       2.4678     1.1041   2.235   0.0254 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: col_corr_abdbri
##                        Chisq Df Pr(>Chisq)    
## (Intercept)         983.0451  1    < 2e-16 ***
## U_landscape           4.1454  2    0.12585    
## U_local               1.5228  2    0.46701    
## U_landscape:U_local  10.8533  4    0.02826 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

order this table (nothing is significant when multiple comparisons are used)

visualisation

## # A tibble: 9 × 7
##   U_landscape U_local emmean    SE    df lower.CL upper.CL
##   <fct>       <fct>    <dbl> <dbl> <dbl>    <dbl>    <dbl>
## 1 LOW         LOW       23.3 0.745  1367     21.9     24.8
## 2 MEDIUM      LOW       23.3 0.756  1367     21.8     24.8
## 3 HIGH        LOW       21.5 0.725  1367     20.1     22.9
## 4 LOW         MEDIUM    22.7 0.875  1367     21.0     24.4
## 5 MEDIUM      MEDIUM    22.1 0.735  1367     20.6     23.5
## 6 HIGH        MEDIUM    23.5 0.753  1367     22.0     25.0
## 7 LOW         HIGH      22.4 0.729  1367     21.0     23.8
## 8 MEDIUM      HIGH      22.7 0.726  1367     21.3     24.1
## 9 HIGH        HIGH      23.0 0.733  1367     21.6     24.4

interaction is significant however outlier test is significant and KS test => maybe best check trends with data_col_filt

repeat statistics but than for the filtered dataset ###statistics - data_col_filt

##  Family: gaussian  ( identity )
## Formula:          
## col_corr_abdbri ~ U_landscape * U_local + (1 | plotid/location)
## Data: data_col_filt
## 
##      AIC      BIC   logLik deviance df.resid 
##   7962.6   8025.0  -3969.3   7938.6     1325 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept)  0.6069  0.7791  
##  plotid          (Intercept)  1.7694  1.3302  
##  Residual                    21.1137  4.5950  
## Number of obs: 1337, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2): 21.1 
## 
## Conditional model:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      23.0347     0.6417   35.90  < 2e-16 ***
## U_landscapeMEDIUM                -0.2022     0.9149   -0.22  0.82509    
## U_landscapeHIGH                  -2.0578     0.8955   -2.30  0.02157 *  
## U_localMEDIUM                    -0.9267     0.7631   -1.21  0.22456    
## U_localHIGH                      -0.9141     0.6409   -1.43  0.15380    
## U_landscapeMEDIUM:U_localMEDIUM   0.2674     1.0064    0.27  0.79049    
## U_landscapeHIGH:U_localMEDIUM     3.0658     1.0006    3.06  0.00218 ** 
## U_landscapeMEDIUM:U_localHIGH     0.5583     0.9120    0.61  0.54044    
## U_landscapeHIGH:U_localHIGH       2.1422     0.8999    2.38  0.01729 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: col_corr_abdbri
##                         Chisq Df Pr(>Chisq)    
## (Intercept)         1288.6367  1  < 2.2e-16 ***
## U_landscape            6.4467  2   0.039822 *  
## U_local                2.4532  2   0.293293    
## U_landscape:U_local   13.9562  4   0.007436 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

##  contrast      estimate    SE   df t.ratio p.value
##  LOW - MEDIUM    -0.073 0.740 1325  -0.099  0.9946
##  LOW - HIGH       0.322 0.741 1325   0.434  0.9012
##  MEDIUM - HIGH    0.395 0.730 1325   0.541  0.8510
## 
## Results are averaged over the levels of: U_local 
## P value adjustment: tukey method for comparing a family of 3 estimates
##  contrast                    estimate    SE   df t.ratio p.value
##  LOW LOW - MEDIUM LOW          0.2022 0.915 1325   0.221  1.0000
##  LOW LOW - HIGH LOW            2.0578 0.896 1325   2.298  0.3440
##  LOW LOW - LOW MEDIUM          0.9267 0.763 1325   1.214  0.9534
##  LOW LOW - MEDIUM MEDIUM       0.8616 0.900 1325   0.957  0.9894
##  LOW LOW - HIGH MEDIUM        -0.0813 0.914 1325  -0.089  1.0000
##  LOW LOW - LOW HIGH            0.9141 0.641 1325   1.426  0.8878
##  LOW LOW - MEDIUM HIGH         0.5580 0.895 1325   0.624  0.9995
##  LOW LOW - HIGH HIGH           0.8297 0.903 1325   0.919  0.9919
##  MEDIUM LOW - HIGH LOW         1.8556 0.903 1325   2.055  0.5051
##  MEDIUM LOW - LOW MEDIUM       0.7245 0.992 1325   0.730  0.9984
##  MEDIUM LOW - MEDIUM MEDIUM    0.6594 0.656 1325   1.005  0.9855
##  MEDIUM LOW - HIGH MEDIUM     -0.2835 0.921 1325  -0.308  1.0000
##  MEDIUM LOW - LOW HIGH         0.7119 0.904 1325   0.787  0.9972
##  MEDIUM LOW - MEDIUM HIGH      0.3558 0.649 1325   0.548  0.9998
##  MEDIUM LOW - HIGH HIGH        0.6275 0.910 1325   0.689  0.9989
##  HIGH LOW - LOW MEDIUM        -1.1310 0.974 1325  -1.161  0.9643
##  HIGH LOW - MEDIUM MEDIUM     -1.1962 0.888 1325  -1.347  0.9169
##  HIGH LOW - HIGH MEDIUM       -2.1391 0.647 1325  -3.305  0.0271
##  HIGH LOW - LOW HIGH          -1.1437 0.885 1325  -1.293  0.9335
##  HIGH LOW - MEDIUM HIGH       -1.4997 0.883 1325  -1.699  0.7472
##  HIGH LOW - HIGH HIGH         -1.2281 0.632 1325  -1.943  0.5835
##  LOW MEDIUM - MEDIUM MEDIUM   -0.0652 0.979 1325  -0.067  1.0000
##  LOW MEDIUM - HIGH MEDIUM     -1.0080 0.991 1325  -1.017  0.9843
##  LOW MEDIUM - LOW HIGH        -0.0126 0.747 1325  -0.017  1.0000
##  LOW MEDIUM - MEDIUM HIGH     -0.3687 0.974 1325  -0.379  1.0000
##  LOW MEDIUM - HIGH HIGH       -0.0970 0.981 1325  -0.099  1.0000
##  MEDIUM MEDIUM - HIGH MEDIUM  -0.9429 0.906 1325  -1.040  0.9819
##  MEDIUM MEDIUM - LOW HIGH      0.0526 0.889 1325   0.059  1.0000
##  MEDIUM MEDIUM - MEDIUM HIGH  -0.3035 0.628 1325  -0.483  0.9999
##  MEDIUM MEDIUM - HIGH HIGH    -0.0319 0.895 1325  -0.036  1.0000
##  HIGH MEDIUM - LOW HIGH        0.9954 0.903 1325   1.102  0.9739
##  HIGH MEDIUM - MEDIUM HIGH     0.6393 0.901 1325   0.710  0.9987
##  HIGH MEDIUM - HIGH HIGH       0.9110 0.657 1325   1.387  0.9028
##  LOW HIGH - MEDIUM HIGH       -0.3561 0.884 1325  -0.403  1.0000
##  LOW HIGH - HIGH HIGH         -0.0844 0.892 1325  -0.095  1.0000
##  MEDIUM HIGH - HIGH HIGH       0.2717 0.890 1325   0.305  1.0000
## 
## P value adjustment: tukey method for comparing a family of 9 estimates
contrast estimate SE df t.ratio p.value
HIGH LOW - HIGH MEDIUM -2.13907 0.6471824 1325 -3.305204 0.0271121

difference is between local low urbanisation level and local medium urbanisation level within highly urbanised landscapes

but still outlier test significant and ks test as well

## # A tibble: 9 × 7
##   U_landscape U_local emmean    SE    df lower.CL upper.CL
##   <fct>       <fct>    <dbl> <dbl> <dbl>    <dbl>    <dbl>
## 1 LOW         LOW       23.0 0.642  1325     21.8     24.3
## 2 MEDIUM      LOW       22.8 0.652  1325     21.6     24.1
## 3 HIGH        LOW       21.0 0.625  1325     19.8     22.2
## 4 LOW         MEDIUM    22.1 0.748  1325     20.6     23.6
## 5 MEDIUM      MEDIUM    22.2 0.631  1325     20.9     23.4
## 6 HIGH        MEDIUM    23.1 0.650  1325     21.8     24.4
## 7 LOW         HIGH      22.1 0.626  1325     20.9     23.3
## 8 MEDIUM      HIGH      22.5 0.624  1325     21.3     23.7
## 9 HIGH        HIGH      22.2 0.635  1325     21.0     23.5

comparison of the outputs of modA and modA_filt, so the normal color dataset and the filtered colour dataset

in summary on the graph a trend is visible: -in low urbanised landscapes: spiders tend to become darker with increasing urbanisation level at local scale -in medium urbanised landscapes: spiders tend to become darker with increasing urbanisation level at local scale, however spiders in the medium urbanised locations are the darkest, -in high urbanised landscapes: spiders tend to become paler with increasing urbanisation level, however the reflectance of spiders in locally high urbanised locations is roughly the same across the urbanisation levels at landscape scale. meaning that all “purple” dots are roughly the same across the landscape urbanisation gradient. It is mainly the spiders in the least urbanised location that are very dark

or rephrased: the significant interaction indicates that depending on the U_landscape context so whether it is low&medium vs high that the effect of urbanisation on the local scale is different. i.e. in low&medium landscapes the spiders in urbanised local sites are darker than there natural counterparts but in high urbanised landscapes the spiders in local urban areas are paler than there natural counterpart. However if you compare the this high-high to the others the spiders are still quite dark in a very urbanised setting compared to other ubanisation settings

only significant difference was found within the highly urbanised landscapes: namely significant difference between spiders in locally low urbanised and locally medium urbanised locations: local low urbanised spiders (very dark spiders) and local medium urbanised spiders (very light spiders) is significantly different

colour - leafdark - leaflight - statistics

maybe less usefull big range of values are based on 3 point measurements => average of this => this average then corrected so you get % reflectance ####statistics-leaflight

##  Family: gaussian  ( identity )
## Formula:          
## col_corr_leaflight ~ U_landscape * U_local + (1 | plotid/location)
## Data: data_col
## 
##      AIC      BIC   logLik deviance df.resid 
##   9576.9   9639.6  -4776.4   9552.9     1367 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept)  1.516   1.231   
##  plotid          (Intercept)  3.569   1.889   
##  Residual                    57.140   7.559   
## Number of obs: 1379, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2): 57.1 
## 
## Conditional model:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      24.6186     0.9757  25.232  < 2e-16 ***
## U_landscapeMEDIUM                -1.2312     1.3923  -0.884 0.376523    
## U_landscapeHIGH                  -3.4297     1.3584  -2.525 0.011577 *  
## U_localMEDIUM                    -2.0918     1.2244  -1.708 0.087549 .  
## U_localHIGH                      -1.5851     1.0316  -1.537 0.124394    
## U_landscapeMEDIUM:U_localMEDIUM   1.1766     1.6166   0.728 0.466728    
## U_landscapeHIGH:U_localMEDIUM     5.5009     1.6048   3.428 0.000608 ***
## U_landscapeMEDIUM:U_localHIGH     1.1492     1.4676   0.783 0.433618    
## U_landscapeHIGH:U_localHIGH       4.3086     1.4422   2.988 0.002812 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: col_corr_leaflight
##                       Chisq Df Pr(>Chisq)    
## (Intercept)         636.672  1  < 2.2e-16 ***
## U_landscape           6.574  2   0.037366 *  
## U_local               3.668  2   0.159775    
## U_landscape:U_local  16.512  4   0.002404 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

## # A tibble: 36 × 6
##    contrast                estimate    SE    df t.ratio p.value
##    <chr>                      <dbl> <dbl> <dbl>   <dbl>   <dbl>
##  1 LOW LOW - MEDIUM LOW      1.23    1.39  1367  0.884    0.994
##  2 LOW LOW - HIGH LOW        3.43    1.36  1367  2.52     0.221
##  3 LOW LOW - LOW MEDIUM      2.09    1.22  1367  1.71     0.741
##  4 LOW LOW - MEDIUM MEDIUM   2.15    1.37  1367  1.57     0.822
##  5 LOW LOW - HIGH MEDIUM     0.0206  1.39  1367  0.0148   1    
##  6 LOW LOW - LOW HIGH        1.59    1.03  1367  1.54     0.838
##  7 LOW LOW - MEDIUM HIGH     1.67    1.36  1367  1.23     0.951
##  8 LOW LOW - HIGH HIGH       0.706   1.37  1367  0.517    1.00 
##  9 MEDIUM LOW - HIGH LOW     2.20    1.37  1367  1.60     0.803
## 10 MEDIUM LOW - LOW MEDIUM   0.861   1.52  1367  0.566    1.00 
## # ℹ 26 more rows
contrast estimate SE df t.ratio p.value
HIGH LOW - HIGH MEDIUM -3.409108 1.036996 1367 -3.287483 0.0286773
## # A tibble: 9 × 7
##   U_landscape U_local emmean    SE    df lower.CL upper.CL
##   <fct>       <fct>    <dbl> <dbl> <dbl>    <dbl>    <dbl>
## 1 LOW         LOW       24.6 0.976  1367     22.7     26.5
## 2 MEDIUM      LOW       23.4 0.994  1367     21.4     25.3
## 3 HIGH        LOW       21.2 0.945  1367     19.3     23.0
## 4 LOW         MEDIUM    22.5 1.15   1367     20.3     24.8
## 5 MEDIUM      MEDIUM    22.5 0.960  1367     20.6     24.4
## 6 HIGH        MEDIUM    24.6 0.988  1367     22.7     26.5
## 7 LOW         HIGH      23.0 0.952  1367     21.2     24.9
## 8 MEDIUM      HIGH      23.0 0.947  1367     21.1     24.8
## 9 HIGH        HIGH      23.9 0.957  1367     22.0     25.8

statistics - filtered leaflight

##  Family: gaussian  ( identity )
## Formula:          
## col_corr_leaflight ~ U_landscape * U_local + (1 | plotid/location)
## Data: data_col_filt
## 
##      AIC      BIC   logLik deviance df.resid 
##   8982.8   9045.2  -4479.4   8958.8     1325 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept)  0.4721  0.6871  
##  plotid          (Intercept)  3.1583  1.7772  
##  Residual                    45.8844  6.7738  
## Number of obs: 1337, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2): 45.9 
## 
## Conditional model:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      24.2335     0.8496  28.524  < 2e-16 ***
## U_landscapeMEDIUM                -1.7177     1.2124  -1.417  0.15657    
## U_landscapeHIGH                  -3.6748     1.1826  -3.107  0.00189 ** 
## U_localMEDIUM                    -2.3756     1.0085  -2.356  0.01849 *  
## U_localHIGH                      -1.5222     0.8376  -1.817  0.06916 .  
## U_landscapeMEDIUM:U_localMEDIUM   2.3155     1.3236   1.749  0.08022 .  
## U_landscapeHIGH:U_localMEDIUM     6.1034     1.3181   4.631 3.65e-06 ***
## U_landscapeMEDIUM:U_localHIGH     1.6794     1.1923   1.409  0.15896    
## U_landscapeHIGH:U_localHIGH       3.8585     1.1741   3.286  0.00101 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: col_corr_leaflight
##                        Chisq Df Pr(>Chisq)    
## (Intercept)         813.6436  1  < 2.2e-16 ***
## U_landscape           9.6839  2   0.007892 ** 
## U_local               6.2788  2   0.043308 *  
## U_landscape:U_local  24.5583  4  6.172e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

## # A tibble: 36 × 6
##    contrast                estimate    SE    df t.ratio p.value
##    <chr>                      <dbl> <dbl> <dbl>   <dbl>   <dbl>
##  1 LOW LOW - MEDIUM LOW      1.72   1.21   1325  1.42    0.892 
##  2 LOW LOW - HIGH LOW        3.67   1.18   1325  3.11    0.0499
##  3 LOW LOW - LOW MEDIUM      2.38   1.01   1325  2.36    0.310 
##  4 LOW LOW - MEDIUM MEDIUM   1.78   1.19   1325  1.49    0.858 
##  5 LOW LOW - HIGH MEDIUM    -0.0530 1.21   1325 -0.0438  1.00  
##  6 LOW LOW - LOW HIGH        1.52   0.838  1325  1.82    0.671 
##  7 LOW LOW - MEDIUM HIGH     1.56   1.18   1325  1.32    0.925 
##  8 LOW LOW - HIGH HIGH       1.34   1.19   1325  1.12    0.971 
##  9 MEDIUM LOW - HIGH LOW     1.96   1.19   1325  1.64    0.783 
## 10 MEDIUM LOW - LOW MEDIUM   0.658  1.32   1325  0.499   1.00  
## # ℹ 26 more rows
contrast estimate SE df t.ratio p.value
LOW LOW - HIGH LOW 3.674759 1.1826288 1325 3.107281 0.0499430
HIGH LOW - HIGH MEDIUM -3.727751 0.8470395 1325 -4.400918 0.0003965
## # A tibble: 9 × 7
##   U_landscape U_local emmean    SE    df lower.CL upper.CL
##   <fct>       <fct>    <dbl> <dbl> <dbl>    <dbl>    <dbl>
## 1 LOW         LOW       24.2 0.850  1325     22.6     25.9
## 2 MEDIUM      LOW       22.5 0.866  1325     20.8     24.2
## 3 HIGH        LOW       20.6 0.823  1325     18.9     22.2
## 4 LOW         MEDIUM    21.9 0.994  1325     19.9     23.8
## 5 MEDIUM      MEDIUM    22.5 0.833  1325     20.8     24.1
## 6 HIGH        MEDIUM    24.3 0.864  1325     22.6     26.0
## 7 LOW         HIGH      22.7 0.825  1325     21.1     24.3
## 8 MEDIUM      HIGH      22.7 0.821  1325     21.1     24.3
## 9 HIGH        HIGH      22.9 0.839  1325     21.2     24.5

result: trends visualy the same (some change for medium landscapes)

####statistics leafdark

##  Family: gaussian  ( identity )
## Formula:          
## col_corr_leafdark ~ U_landscape * U_local + (1 | plotid/location)
## Data: data_col
## 
##      AIC      BIC   logLik deviance df.resid 
##   8109.8   8172.6  -4042.9   8085.8     1367 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept)  0.3624  0.602   
##  plotid          (Intercept)  1.4393  1.200   
##  Residual                    19.7646  4.446   
## Number of obs: 1379, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2): 19.8 
## 
## Conditional model:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      15.6023     0.5776  27.013   <2e-16 ***
## U_landscapeMEDIUM                -0.3606     0.8239  -0.438   0.6616    
## U_landscapeHIGH                  -1.3140     0.8046  -1.633   0.1025    
## U_localMEDIUM                    -0.3613     0.6881  -0.525   0.5996    
## U_localHIGH                      -0.6943     0.5757  -1.206   0.2278    
## U_landscapeMEDIUM:U_localMEDIUM   0.2561     0.9063   0.283   0.7775    
## U_landscapeHIGH:U_localMEDIUM     2.0352     0.8990   2.264   0.0236 *  
## U_landscapeMEDIUM:U_localHIGH     0.8048     0.8195   0.982   0.3260    
## U_landscapeHIGH:U_localHIGH       1.0246     0.8043   1.274   0.2027    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: col_corr_leafdark
##                        Chisq Df Pr(>Chisq)    
## (Intercept)         729.7089  1    < 2e-16 ***
## U_landscape           2.8640  2    0.23883    
## U_local               1.4549  2    0.48314    
## U_landscape:U_local   8.1710  4    0.08551 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

## # A tibble: 36 × 6
##    contrast                 estimate    SE    df   t.ratio p.value
##    <chr>                       <dbl> <dbl> <dbl>     <dbl>   <dbl>
##  1 LOW LOW - MEDIUM LOW     0.361    0.824  1367  0.438      1.00 
##  2 LOW LOW - HIGH LOW       1.31     0.805  1367  1.63       0.787
##  3 LOW LOW - LOW MEDIUM     0.361    0.688  1367  0.525      1.00 
##  4 LOW LOW - MEDIUM MEDIUM  0.466    0.811  1367  0.575      1.00 
##  5 LOW LOW - HIGH MEDIUM   -0.360    0.822  1367 -0.438      1.00 
##  6 LOW LOW - LOW HIGH       0.694    0.576  1367  1.21       0.955
##  7 LOW LOW - MEDIUM HIGH    0.250    0.805  1367  0.311      1.00 
##  8 LOW LOW - HIGH HIGH      0.984    0.809  1367  1.22       0.953
##  9 MEDIUM LOW - HIGH LOW    0.953    0.812  1367  1.17       0.962
## 10 MEDIUM LOW - LOW MEDIUM  0.000623 0.895  1367  0.000696   1    
## # ℹ 26 more rows
contrast estimate SE df t.ratio p.value
HIGH LOW - HIGH MEDIUM -1.673927 0.5793073 1367 -2.889532 0.0920716
## # A tibble: 9 × 7
##   U_landscape U_local emmean    SE    df lower.CL upper.CL
##   <fct>       <fct>    <dbl> <dbl> <dbl>    <dbl>    <dbl>
## 1 LOW         LOW       15.6 0.578  1367     14.5     16.7
## 2 MEDIUM      LOW       15.2 0.588  1367     14.1     16.4
## 3 HIGH        LOW       14.3 0.560  1367     13.2     15.4
## 4 LOW         MEDIUM    15.2 0.675  1367     13.9     16.6
## 5 MEDIUM      MEDIUM    15.1 0.569  1367     14.0     16.3
## 6 HIGH        MEDIUM    16.0 0.585  1367     14.8     17.1
## 7 LOW         HIGH      14.9 0.564  1367     13.8     16.0
## 8 MEDIUM      HIGH      15.4 0.561  1367     14.3     16.5
## 9 HIGH        HIGH      14.6 0.567  1367     13.5     15.7

assumptions of the statistics not ok

####statisticks - filtered leafdark

##  Family: gaussian  ( identity )
## Formula:          
## col_corr_leafdark ~ U_landscape * U_local + (1 | plotid/location)
## Data: data_col_filt
## 
##      AIC      BIC   logLik deviance df.resid 
##   7666.8   7729.2  -3821.4   7642.8     1325 
## 
## Random effects:
## 
## Conditional model:
##  Groups          Name        Variance Std.Dev.
##  location:plotid (Intercept)  0.2497  0.4997  
##  plotid          (Intercept)  1.4570  1.2071  
##  Residual                    17.0460  4.1287  
## Number of obs: 1337, groups:  location:plotid, 80; plotid, 27
## 
## Dispersion estimate for gaussian family (sigma^2):   17 
## 
## Conditional model:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      15.4502     0.5552  27.829  < 2e-16 ***
## U_landscapeMEDIUM                -0.3826     0.7915  -0.483  0.62883    
## U_landscapeHIGH                  -1.4505     0.7743  -1.873  0.06103 .  
## U_localMEDIUM                    -0.6700     0.6329  -1.059  0.28974    
## U_localHIGH                      -0.7624     0.5267  -1.448  0.14772    
## U_landscapeMEDIUM:U_localMEDIUM   0.8021     0.8315   0.965  0.33469    
## U_landscapeHIGH:U_localMEDIUM     2.4467     0.8268   2.959  0.00308 ** 
## U_landscapeMEDIUM:U_localHIGH     0.9169     0.7498   1.223  0.22139    
## U_landscapeHIGH:U_localHIGH       0.9566     0.7388   1.295  0.19537    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Deviance Table (Type III Wald chisquare tests)
## 
## Response: col_corr_leafdark
##                        Chisq Df Pr(>Chisq)    
## (Intercept)         774.4422  1    < 2e-16 ***
## U_landscape           3.7905  2    0.15028    
## U_local               2.3088  2    0.31524    
## U_landscape:U_local  11.2784  4    0.02361 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

## # A tibble: 36 × 6
##    contrast                estimate    SE    df t.ratio p.value
##    <chr>                      <dbl> <dbl> <dbl>   <dbl>   <dbl>
##  1 LOW LOW - MEDIUM LOW       0.383 0.792  1325   0.483   1.00 
##  2 LOW LOW - HIGH LOW         1.45  0.774  1325   1.87    0.632
##  3 LOW LOW - LOW MEDIUM       0.670 0.633  1325   1.06    0.980
##  4 LOW LOW - MEDIUM MEDIUM    0.250 0.778  1325   0.322   1.00 
##  5 LOW LOW - HIGH MEDIUM     -0.326 0.791  1325  -0.412   1.00 
##  6 LOW LOW - LOW HIGH         0.762 0.527  1325   1.45    0.879
##  7 LOW LOW - MEDIUM HIGH      0.228 0.774  1325   0.295   1.00 
##  8 LOW LOW - HIGH HIGH        1.26  0.781  1325   1.61    0.800
##  9 MEDIUM LOW - HIGH LOW      1.07  0.781  1325   1.37    0.910
## 10 MEDIUM LOW - LOW MEDIUM    0.287 0.855  1325   0.336   1.00 
## # ℹ 26 more rows
contrast estimate SE df t.ratio p.value
HIGH LOW - HIGH MEDIUM -1.776658 0.5324686 1325 -3.336643 0.0244914
HIGH MEDIUM - HIGH HIGH 1.582450 0.5416742 1325 2.921405 0.0845517
## # A tibble: 9 × 7
##   U_landscape U_local emmean    SE    df lower.CL upper.CL
##   <fct>       <fct>    <dbl> <dbl> <dbl>    <dbl>    <dbl>
## 1 LOW         LOW       15.5 0.555  1325     14.4     16.5
## 2 MEDIUM      LOW       15.1 0.564  1325     14.0     16.2
## 3 HIGH        LOW       14.0 0.540  1325     12.9     15.1
## 4 LOW         MEDIUM    14.8 0.642  1325     13.5     16.0
## 5 MEDIUM      MEDIUM    15.2 0.546  1325     14.1     16.3
## 6 HIGH        MEDIUM    15.8 0.563  1325     14.7     16.9
## 7 LOW         HIGH      14.7 0.541  1325     13.6     15.7
## 8 MEDIUM      HIGH      15.2 0.539  1325     14.2     16.3
## 9 HIGH        HIGH      14.2 0.549  1325     13.1     15.3

combination of the results result: trends visualy the same (some change for medium landscapes) using the filterd dataset : data_col_filt (seen on the right side of the graph): HIGH LOW - HIGH MEDIUM -1.7767 0.532 1325 -3.337 0.0245

with data_col : HIGH LOW - HIGH MEDIUM -1.673927 0.579 1367 -2.890 0.0921 (marginaly signif) in the model interaction was marginally significant as well

When exploring leaflight and leafdark in roughly the same trends as for abdomen brightness

#not necessary for report

##questions about statistical tests

rptR and lme4

question: not completely clear how to use rptR for our dataset

found in literature:

https://onlinelibrary.wiley.com/doi/10.1111/j.1469-185X.2010.00141.x Adjusted repeatability controlling for fixed effects (U_landscape and U_local), was then calculated using the rptR package in R (Nakagawa & Schielzeth, 2013; Stoffel et al., 2017). estimating repeatability (intra-class correlation) and confidence intervals (C.I) from Gaussian data (Stoffel et al. 2017) Unadjusted repeatability measures the between-individual variation in a given …response variable……, while adjusted repeatability controls for fixed effects that could influence ….response variable….., either because they explain between or within individual components of variation. For both adjusted and unadjusted repeatability, we included ….location…. as a random effect info : https://cran.r-project.org/web/packages/rptR/vignettes/rptR.html

I have set this code chunk as eval=FALSE so they will not be evaluated on knit

remark lme4 gives different output, because is based on REML REML necessary for small sample sizes for model comparisons ML is needed. for now I used the ML method

I have set these chunks as eval=FALSE so they will not be evaluated on knit

however the degrees of freedom when asking emmeans is different kenward-roger approximation only applied to REML models Satterthwaite approximation can be applied to ML and REML models

I have set these chunks as eval=FALSE so they will not be evaluated on knit

performance package is developed for models via lme4 ! I have set these chunks as eval=FALSE so they will not be evaluated on knit

LS0tDQp0aXRsZTogIkNPTE9VUiBBTkFMWVNJUyBTQzIxIHNwZWVkeSBzZXQiDQphdXRob3I6ICJLYXRyaWVuIERlIFdvbGYiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgICBrZWVwX21kOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXY9InBuZyIsIGRwaT0zMDAsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmdzPUZBTFNFKQ0KbGlicmFyeShoZXJlKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdnZWZmZWN0cykNCnNldC5zZWVkKDQpDQpgYGANCg0KYGBge3IgZGF0YSwgZWNobz1GQUxTRX0NCmhlcmUoKQ0KY29sb3VyX2RhdGEgPC0gcmVhZF9jc3YoIlNDMjFfY29ycmVjdGVkX2NvbG91cl9kYXRhLmNzdiIpDQpib2R5X3NpemVfZGF0YSA8LSByZWFkX2NzdjIoIlNDMjFfYm9keV9zaXplLmNzdiIpDQoNClNDMjFfZGF0YSA8LSBsZWZ0X2pvaW4oY29sb3VyX2RhdGEsIGJvZHlfc2l6ZV9kYXRhLCBieT0ic3BpZGVySUQiKSANCg0KIyMgYWRkIHNhbXBsaW5nIGluZm8NCnNhbXBsaW5nX2luZm89cmVhZC5kZWxpbSgiU0MyMV9zYW1wbGluZ19pbmZvLnR4dCIsIGRlYz0iLCIsIHNlcD0gIlx0IiwgbmEuc3RyaW5ncz1jKCIiLCJOQSIpLCBoZWFkZXI9VCkNClNDMjFfZGF0YSA8LSBsZWZ0X2pvaW4oU0MyMV9kYXRhLCBzYW1wbGluZ19pbmZvLCBieT0ibG9jYXRpb24iKSAjY29udGFpbnMgc2FtcGxpbmcgZGF0ZSwgY29vcmRpbmF0ZXMgLCAuLi4NCmBgYA0KDQoqKmFuYWx5c2lzIGRhdGEgY29sbGVjdGVkIGluIDIwMjEqKg0KDQpTQU1QTElORyBJTkZPIENPTlRBSU5TIDg1IHNhbXBsaW5nIHNpdGVzOiAtIDIgcmVwZWF0ZWQgc2FtcGxpbmdzIGJlY2F1c2UNCnRoZSBzcGlkZXJzIHdlcmUgbm90IGZyb3plbiBpbW1lZGlhdGVseTogUDA1U1JfUiBhbmQgUDA0U0dfUiAoaSByZW1vdmUNCnRoZW0gaW4gdGhlIGNvbG91ciBhbmFseXNpcyBhcyBpdCBpcyB0aGVuIHRoZSBtb3N0IHJhbmRvbWl6ZWQgc2NoZW1lIGFuZA0Kb3RoZXJ3aXNlIGl0IHdpbGwgaW5jcmVhc2Ugc2FtcGxpbmcgc2l6ZXMgb2YgbG9jYXRpb24gUDA1U1JfUiBhbmQNClAwNFNHX1Igd2l0aCAyMCBzcGlkZXJzIGVhY2gpIC0gMSBleHRyYSBsb2NhdGlvbiBpbiBCcnVzc2VscyBQMjBTRQ0KKFJCSU5TKSA9XD4gaSBpbmRpY2F0ZWQgaXQgZm9yIG5vdyBhcyBIaWdoIE1lZGl1bSB1cmJhbmlzYXRpb24gY2F0ZWdvcnkNCihjaGVjayB3aXRoIHVyYiByYWRpdXMpIC0gMSBleHRyYSBsb2NhdGlvbiBpbiBHaGVudCwgUDAxU0UsIGJ1dCB3ZSBkaWQNCm5vdCBjb2xsZWN0IHNwaWRlcnMNCg0KdG8gY29uY2x1ZGUgOiBhbGwgODEgdHlwaWNhbCBzcGVlZHkgc2FtcGxpbmcgc2l0ZXMgd2VyZSBzYW1wbGVkOyBhdA0KUDA5U1kgbm8gQS4gZGlhZGVtYXR1cyBmb3VuZA0KDQo9XD4gZm9yIHRoaXMgYW5hbHlzaXMgaSByZW1vdmUgbG9jYXRpb24gUDA1U1JfUiBQMDRTR19SIFAyMFNFOg0KYGBge3IgY2xlYW5pbmd9DQojUkVNT1ZFIEVYVFJBIFNBTVBMSU5HUw0KdW5pcXVlKFNDMjFfZGF0YSRsb2NhdGlvbikNCmZfbG9jIDwtIGMoIlAwNFNHX1IiLCAiUDA1U1JfUiIsICJQMjBTRSIpDQpTQzIxX2RhdGEgPC0gU0MyMV9kYXRhICU+JQ0KICBkcGx5cjo6ZmlsdGVyKCFsb2NhdGlvbiAlaW4lIGZfbG9jKSANCmBgYA0KDQpwcmVwYXJhdGlvbiBvZiBkYXRhc2V0Og0KYGBge3IgcHJlcGFyYXRpb259DQpuYW1lcyhTQzIxX2RhdGEpDQpzdHIoU0MyMV9kYXRhKQ0KDQpTQzIxX2RhdGEkc3BpZGVySUQgPC0gYXMuZmFjdG9yKFNDMjFfZGF0YSRzcGlkZXJJRCkNClNDMjFfZGF0YSRwcm9qZWN0X3llYXIgPC0gYXMuZmFjdG9yKFNDMjFfZGF0YSRwcm9qZWN0X3llYXIpDQpTQzIxX2RhdGEkbG9jYXRpb24gPC0gYXMuZmFjdG9yKFNDMjFfZGF0YSRsb2NhdGlvbikNCmxldmVscyhTQzIxX2RhdGEkbG9jYXRpb24pDQpTQzIxX2RhdGEkbG9jYXRpb24gPC0gZmFjdG9yKFNDMjFfZGF0YSRsb2NhdGlvbiwgbGV2ZWxzPWMoIlAwMVNHIiwgIlAwMVNZIiwgIlAwMVNSIiwgIlAwMlNHIiwgIlAwMlNZIiwgIlAwMlNSIiwgIlAwM1NHIiwgIlAwM1NZIiwgIlAwM1NSIiwgIlAwNFNHIiwgIlAwNFNZIiwgIlAwNFNSIiwgIlAwNVNHIiwgIlAwNVNZIiwgIlAwNVNSIiwgIlAwNlNHIiwgIlAwNlNZIiwgIlAwNlNSIiwgIlAwN1NHIiwgIlAwN1NZIiwgIlAwN1NSIiwgIlAwOFNHIiwgIlAwOFNZIiwgIlAwOFNSIiwgIlAwOVNHIiwgIlAwOVNSIiwgIlAxMFNHIiwgIlAxMFNZIiwgIlAxMFNSIiwgIlAxMVNHIiwgIlAxMVNZIiwgIlAxMVNSIiwgIlAxMlNHIiwgIlAxMlNZIiwgIlAxMlNSIiwgIlAxM1NHIiwgIlAxM1NZIiwgIlAxM1NSIiwgIlAxNFNHIiwgIlAxNFNZIiwgIlAxNFNSIiwgIlAxNVNHIiwgIlAxNVNZIiwgIlAxNVNSIiwgIlAxNlNHIiwgIlAxNlNZIiwgIlAxNlNSIiwgIlAxN1NHIiwgIlAxN1NZIiwgIlAxN1NSIiwgIlAxOFNHIiwgIlAxOFNZIiwgIlAxOFNSIiwgIlAxOVNHIiwgIlAxOVNZIiwgIlAxOVNSIiwgIlAyMFNHIiwgIlAyMFNZIiwgIlAyMFNSIiwgIlAyMVNHIiwgIlAyMVNZIiwgIlAyMVNSIiwgIlAyMlNHIiwgIlAyMlNZIiwgIlAyMlNSIiwgIlAyM1NHIiwgIlAyM1NZIiwgIlAyM1NSIiwgIlAyNFNHIiwgIlAyNFNZIiwgIlAyNFNSIiwgIlAyNVNHIiwgIlAyNVNZIiwgIlAyNVNSIiwgIlAyNlNHIiwgIlAyNlNZIiwgIlAyNlNSIiwgIlAyN1NHIiwgIlAyN1NZIiwgIlAyN1NSIikpIA0KIyMgY29ycmVjdCA4MCBzYW1wbGluZ3NpdGVzIGJlY2F1c2UgUDA5U1kgaGFkIG5vIEEuIGRpYWRlbWF0dXMgc3BpZGVycyBwcmVzZW50ICAgICAgICAgICAgICAgICAgIA0KDQpTQzIxX2RhdGEkcGxvdGlkPC1hcy5mYWN0b3IoU0MyMV9kYXRhJHBsb3RpZCkgICMjb3JkZXIgaXMgYWxyZWFkeSBjb3JyZWN0bHkgZnJvbSBQMDEgLSBQMjcNClNDMjFfZGF0YSRjaXR5PC1hcy5mYWN0b3IoU0MyMV9kYXRhJGNpdHkpICMjIGFscGhhYmV0aWNhbGx5IG9yZGVyZWQgb2sNClNDMjFfZGF0YSRyZWdpb248LWFzLmZhY3RvcihTQzIxX2RhdGEkcmVnaW9uKSAjI2FscGhhYmV0aWNhbGx5IG9yZGVyZWQgb2sgQW50d2VycGVuIEdlbnQgTGV1dmVuDQoNClNDMjFfZGF0YSRVX2xhbmRzY2FwZTwtYXMuZmFjdG9yKFNDMjFfZGF0YSRVX2xhbmRzY2FwZSkNCmxldmVscyhTQzIxX2RhdGEkVV9sYW5kc2NhcGUpDQpTQzIxX2RhdGEkVV9sYW5kc2NhcGU8LSBmYWN0b3IoU0MyMV9kYXRhJFVfbGFuZHNjYXBlLCBsZXZlbHM9YygiTE9XIiwgIk1FRElVTSIsICJISUdIIikpDQpTQzIxX2RhdGEkVV9sb2NhbDwtYXMuZmFjdG9yKFNDMjFfZGF0YSRVX2xvY2FsKQ0KbGV2ZWxzKFNDMjFfZGF0YSRVX2xvY2FsKQ0KU0MyMV9kYXRhJFVfbG9jYWw8LWZhY3RvcihTQzIxX2RhdGEkVV9sb2NhbCwgbGV2ZWxzPWMoIkxPVyIsICJNRURJVU0iLCAiSElHSCIpKQ0KIyMjIG9yZGVyZWQgVV9sYW5kc2NhcGUgYW5kIFVfbG9jYWwgZnJvbSBsb3cgdG8gaGlnaCB1cmJhbmlzYXRpb24NCg0KU0MyMV9kYXRhJHVyYl9jYXQgPC0gYXMuZmFjdG9yKFNDMjFfZGF0YSR1cmJfY2F0KQ0KbGV2ZWxzKFNDMjFfZGF0YSR1cmJfY2F0KQ0KU0MyMV9kYXRhJHVyYl9jYXQgPC0gZmFjdG9yKFNDMjFfZGF0YSR1cmJfY2F0LCBsZXZlbHM9YygiTE9XTE9XIiwgIkxPV01FRElVTSIsICJMT1dISUdIIiwgIk1FRElVTUxPVyIsICJNRURJVU1NRURJVU0iLCAiTUVESVVNSElHSCIsICJISUdITE9XIiwgIkhJR0hNRURJVU0iLCAiSElHSEhJR0giKSkNCiNvcmRlcmVkIHRoZSA5IHVyYmFuaXNhdGlvbiBjYXRlZ29yaWVzOiB0aGUgY29tYmluYXRpb24gb2YgVV9sYW5kc2NhcGUgYW5kIFVfbG9jYWwgZnJvbSBsb3cgdXJiYW5pc2F0aW9uIHRvIGhpZ2ggdXJiYW5pc2F0aW9uIA0KDQpsaWJyYXJ5KGNocm9uKQ0KU0MyMV9kYXRhJGRheSA8LSBhcy5udW1lcmljKGNocm9uKGRhdGVzLiA9IGFzLmNoYXJhY3RlcihTQzIxX2RhdGEkc2FtcGxpbmdfZGF0ZSksIGZvcm1hdCA9IGMoZGF0ZXMgPSAiZC9tL3kiKSwgb3JpZ2luLiA9IGMoMSwgMSwgMjAyMSkpKQ0KIyMgYWZ0ZXIgdGhpcyBkYXRlIGNhbiBiZSBwdXQgdG8gYSBkYXRlIG9iamVjdDsgYnV0IGluIG15IGFuYWx5c2lzIG5vdCBuZWNlc3NhcnkgIA0KU0MyMV9kYXRhJHNhbXBsaW5nX2RhdGU8LWFzLkRhdGUoU0MyMV9kYXRhJHNhbXBsaW5nX2RhdGUsIGZvcm1hdD0iJWQvJW0vJVkiKQ0KaXMuRGF0ZShTQzIxX2RhdGEkc2FtcGxpbmdfZGF0ZSkNCg0KIyMjIyB4IGFuZCB5IGNvb3JkaW5hdGVzIGFzIGNocg0KDQojIyBjcmVhdGUgY29sb3VyIHZlY3RvcnMNCnVyYi5jb2wzIDwtYygiIzM4QTgwMCIsIiNFNkU2MDAiLCIjOGMwMDhjIikgI3VyYmFuaXNhdGlvbiBjb2xvdXIgdmVjdG9yIHRvIHVzZSBpbiBncmFwaHMNCg0KdXJiLmNvbDkgPC1jKCIjMzhBODAwIiwgImxpZ2h0Z3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiAsICJ5ZWxsb3ciLCAiI0U2RTYwMCIsICJnb2xkZW5yb2QxIiwgImRlZXBwaW5rMyIsICJwdXJwbGUiLCAiIzhjMDA4YyIpICNjb2xvdXIgdmVjdG9yIGZvciB0aGUgOSB1cmJhbmlzYXRpb24gY2F0ZWdvcmllcw0KYGBgDQoNCmV4cGxvcmF0aW9uIG9mIGRhdGE6DQpgYGB7ciBleHBsb3JhdGlvbn0NCmdsaW1wc2UoU0MyMV9kYXRhKQ0KIyMgY2hlY2sgd2hpY2ggY29sdW1ucyBoYXZlIG1pc3NpbmcgZGF0YQ0KbmFtZXMod2hpY2goY29sU3Vtcyhpcy5uYShTQzIxX2RhdGEpKSA+IDApKQ0KIyMgaGVyZSB5b3Ugc2VlIHRoYXQgY3Jvc3NfbGVuZ3RoIGFuZCBjcm9zc193aWR0aCAoYW5kIGFsc28gcmVtYXJrX3NhbXBsaW5nLCBidXQgdGhpcyBkb2Vzbid0IG1hdHRlcikgY29udGFpbiBtaXNzaW5nIHZhbHVlcw0KDQpTQzIxX2RhdGEgJT4lIA0KICBncm91cF9ieShwbG90aWQsIFVfbGFuZHNjYXBlLCBVX2xvY2FsKSAlPiUNCiAgc3VtbWFyaXNlKG49bigpKSU+JQ0KICBnZ3Bsb3QoYWVzKHBsb3RpZCwgbiwgY29sPVVfbG9jYWwpKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpKQ0KDQpTQzIxX2RhdGEgJT4lDQogIGdyb3VwX2J5KHBsb3RpZCwgVV9sYW5kc2NhcGUsIFVfbG9jYWwpICU+JQ0KICBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbT1uLCBuYW1lc19mcm9tPVVfbG9jYWwpIHw+IGtuaXRyOjprYWJsZSgpDQoNClNDMjFfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoVV9sYW5kc2NhcGUsIFVfbG9jYWwpJT4lDQogIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tPW4sIG5hbWVzX2Zyb209VV9sb2NhbCkgfD4ga25pdHI6OmthYmxlKCkNCg0KdGVzdDwtU0MyMV9kYXRhW2lzLm5hKFNDMjFfZGF0YSRjcm9zc19sZW5ndGgpLF0NCiMgMiBpbmRpdjogYygiU0MyMVAxMVNHMTciLCJTQzIxUDEyU1kyMSIpIA0KdGVzdDI8LVNDMjFfZGF0YVtpcy5uYShTQzIxX2RhdGEkY3Jvc3Nfd2lkdGgpLF0NCiMgNiBpbmRpdiANCmBgYA0KcmVtb3ZlIHRob3NlIGluZGl2aWR1YWxzIHNvIHdlIGdldCBkYXRhc2V0IDogZGF0YV9ieiANCnRvIGFuYWx5c2UgdGhlIG1vcnBob2xvZ2ljYWwgbWVhc3VyZW1lbnRzIA0KDQojIyBkYXRhc2V0IGRhdGFfYnogOiBib2R5IHNpemUgbWVhc3VyZW1lbnRzIA0KZmlyc3QgZXhwbG9yYXRpb24gdGhlbiB0ZXN0IGVhY2ggbW9ycGhvbG9naWNhbCB0cmFpdCB2aWEgdW5pdmFyaWF0ZSBtaXhlZCBtb2RlbHMgDQpgYGB7ciBmaWx0ZXJpbmdfYnp9DQpmX2JvZHlzaXplIDwtIGMoIlNDMjFQMTFTRzE3IiwiU0MyMVAxMlNZMjEiLCJTQzIxUDA0U0cxNiIsICJTQzIxUDEyU1kyMSIsICJTQzIxUDE1U1kwMSIsICJTQzIxUDE2U0cxNyIsICJTQzIxUDI3U1IwNyIsICJTQzIxUDI3U1IwOSIpDQojIyBzbyBmb3IgdGhlIGFuYWx5c2lzIG9mIHRoZSBib2R5IG1lYXN1cmVtZW50cyBiZXN0IHRvIGRyb3AgdGhlc2UgaW5kaXYsIGZvciB0aGUgY29sb3VyIGFuYWx5c2lzIGl0IGRvZXNuJ3QgbWF0dGVyDQpkYXRhX2J6IDwtIFNDMjFfZGF0YSAlPiUgDQogIGZpbHRlcighc3BpZGVySUQgJWluJSBmX2JvZHlzaXplKQ0KIyMgYWx0ZXJuYXRpdmU6ICBTQzIxX2RhdGEgJT4lICBkcm9wX25hKGNyb3NzX2xlbmd0aCwgY3Jvc3Nfd2lkdGgpDQoNCmBgYA0KDQojIyMgbGVuZ3RoDQpgYGB7ciBzcGlkZXJfbGVuZ3RofQ0KIyMjIHNwaWRlciBsZW5ndGggYm94cGxvdCBvZiBkYXRhDQpnZ3Bsb3QoZGF0YV9ieiwgYWVzKFVfbG9jYWwsIHNwaWRlcl9sZW5ndGgsIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSsNCiAgZmFjZXRfd3JhcCh+cGxvdGlkKSsNCiAgeWxhYigic3BpZGVyIGxlbmd0aCAobW0pIikrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsb2NhbCBzY2FsZSIpKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsaGp1c3Q9MSkpICsNCiAgZ2d0aXRsZSgic3BpZGVyIGxlbmd0aCIpDQoNCmdncGxvdChkYXRhX2J6LCBhZXMoVV9sYW5kc2NhcGUsIHNwaWRlcl9sZW5ndGgsIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSsNCiAgeWxhYigic3BpZGVyIGxlbmd0aCAobW0pIikrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBhdCBsYW5kc2NhcGUgc2NhbGUiKSsNCiAgdGhlbWVfYncoKSArDQogIGdndGl0bGUoInNwaWRlciBsZW5ndGgiKQ0KDQpnZ3Bsb3QoZGF0YV9ieiwgYWVzKHVyYl9jYXQsIHNwaWRlcl9sZW5ndGgsIGZpbGw9dXJiX2NhdCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2w5LCBuYW1lPSJ1cmJhbmlzYXRpb24gXG5jYXRlZ29yeSIpKw0KICB5bGFiKCJzcGlkZXIgbGVuZ3RoIChtbSkiKSsNCiAgeGxhYigidXJiYW5pc2F0aW9uIGNhdGVnb3J5IikrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSxoanVzdD0xKSkgKw0KICBnZ3RpdGxlKCJzcGlkZXIgbGVuZ3RoIHBlciB1cmJhbmlzYXRpb24gY2F0ZWdvcnkiKQ0KYGBgDQoNCmFsd2F5cyB0aGUgc2FtZSAzIHR5cGUgb2YgdmlzdWFsaXNhdGlvbnMgYXJlIHJlcGVhdGVkIA0KDQojIyMgYWJkb21lbiBsZW5ndGgNCg0KYGBge3IgYWJkb21lbl9sZW5ndGh9DQojIyMgYWJkb21lbiBsZW5ndGggYm94cGxvdCBvZiBkYXRhDQpnZ3Bsb3QoZGF0YV9ieiwgYWVzKFVfbG9jYWwsIGFiZG9tZW5fbGVuZ3RoLCBmaWxsPSBVX2xvY2FsKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gdXJiLmNvbDMsIG5hbWU9InVyYmFuaXNhdGlvbiBsZXZlbCBcbmF0IGxvY2FsIHNjYWxlIikrDQogIGZhY2V0X3dyYXAofnBsb3RpZCkrDQogIHlsYWIoImFiZG9tZW4gbGVuZ3RoIChtbSkiKSsNCiAgeGxhYigidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxvY2FsIHNjYWxlIikrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSxoanVzdD0xKSkgKw0KICBnZ3RpdGxlKCJzcGlkZXIgYWJkb21lbiBsZW5ndGgiKQ0KDQpnZ3Bsb3QoZGF0YV9ieiwgYWVzKFVfbGFuZHNjYXBlLCBhYmRvbWVuX2xlbmd0aCwgZmlsbD0gVV9sb2NhbCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2wzLCBuYW1lPSJ1cmJhbmlzYXRpb24gbGV2ZWwgXG5hdCBsb2NhbCBzY2FsZSIpKw0KICB5bGFiKCJhYmRvbWVuIGxlbmd0aCAobW0pIikrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsYW5kc2NhcGUgc2NhbGUiKSsNCiAgdGhlbWVfYncoKSArDQogIGdndGl0bGUoInNwaWRlciBhYmRvbWVuIGxlbmd0aCIpDQoNCmdncGxvdChkYXRhX2J6LCBhZXModXJiX2NhdCwgYWJkb21lbl9sZW5ndGgsIGZpbGw9dXJiX2NhdCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2w5LCBuYW1lPSJ1cmJhbmlzYXRpb24gXG5jYXRlZ29yeSIpKw0KICB5bGFiKCJhYmRvbWVuIGxlbmd0aCAobW0pIikrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBjYXRlZ29yeSIpKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsaGp1c3Q9MSkpICsNCiAgZ2d0aXRsZSgic3BpZGVyIGFiZG9tZW4gbGVuZ3RoIHBlciB1cmJhbmlzYXRpb24gY2F0ZWdvcnkiKQ0KDQpgYGANCg0KIyMjIGFiZG9tZW4gYXJlYQ0KDQpgYGB7ciBhYmRvbWVuX2FyZWF9DQojYWJkb21lbiBhcmVhIG1pZ2h0IGJlIHNlZW4gYXMgZmVjdW5kaXR5IA0KZ2dwbG90KGRhdGFfYnosIGFlcyhVX2xvY2FsLCBhYmRvbWVuX2FyZWEsIGZpbGw9VV9sb2NhbCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSArDQogIGZhY2V0X3dyYXAofnBsb3RpZCkrDQogIHlsYWIoYnF1b3RlKCdhYmRvbWVuIGFyZWEgKCd+bW1eMn4nKScpKSsNCiAgeGxhYigidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxvY2FsIHNjYWxlIikrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSxoanVzdD0xKSkgKw0KICBnZ3RpdGxlKCJhYmRvbWVuIGFyZWEiKQ0KDQpnZ3Bsb3QoZGF0YV9ieiwgYWVzKFVfbGFuZHNjYXBlLCBhYmRvbWVuX2FyZWEsIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSsNCiAgeWxhYihicXVvdGUoJ2FiZG9tZW4gYXJlYSAoJ35tbV4yficpJykpKw0KICB4bGFiKCJ1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbGFuZHNjYXBlIHNjYWxlIikrDQogIHRoZW1lX2J3KCkgKw0KICBnZ3RpdGxlKCJzcGlkZXIgYWJkb21lbiBhcmVhIikNCg0KZ2dwbG90KGRhdGFfYnosIGFlcyh1cmJfY2F0LCBhYmRvbWVuX2FyZWEsIGZpbGw9dXJiX2NhdCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2w5LCBuYW1lPSJ1cmJhbmlzYXRpb24gXG5jYXRlZ29yeSIpKw0KICB5bGFiKGJxdW90ZSgnYWJkb21lbiBhcmVhICgnfm1tXjJ+JyknKSkrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBjYXRlZ29yeSIpKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsaGp1c3Q9MSkpICsNCiAgZ2d0aXRsZSgic3BpZGVyIGFiZG9tZW4gYXJlYSBwZXIgdXJiYW5pc2F0aW9uIGNhdGVnb3J5IikNCmBgYA0KDQojIyMgY3Jvc3MgbGVuZ3RoDQpgYGB7ciBjcm9zc19sZW5ndGh9DQojY3Jvc3MgbGVuZ3RoIA0KZ2dwbG90KGRhdGFfYnosIGFlcyhVX2xvY2FsLCBjcm9zc19sZW5ndGgsIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSsNCiAgZmFjZXRfd3JhcCh+cGxvdGlkKSsNCiAgeWxhYigiY3Jvc3MgbGVuZ3RoIChtbSkiKSsNCiAgeGxhYigidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxvY2FsIHNjYWxlIikrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSxoanVzdD0xKSkgKw0KICBnZ3RpdGxlKCJjcm9zcyBsZW5ndGgiKQ0KDQpnZ3Bsb3QoZGF0YV9ieiwgYWVzKFVfbGFuZHNjYXBlLCBjcm9zc19sZW5ndGgsIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSsNCiAgeWxhYigiY3Jvc3MgbGVuZ3RoIChtbSkiKSsNCiAgeGxhYigidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSIpKw0KICB0aGVtZV9idygpICsNCiAgZ2d0aXRsZSgiY3Jvc3MgbGVuZ3RoIikNCg0KZ2dwbG90KGRhdGFfYnosIGFlcyh1cmJfY2F0LCBjcm9zc19sZW5ndGgsIGZpbGw9dXJiX2NhdCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2w5LCBuYW1lPSJ1cmJhbmlzYXRpb24gXG5jYXRlZ29yeSIpKw0KICB5bGFiKCJjcm9zcyBsZW5ndGggKG1tKSIpKw0KICB4bGFiKCJ1cmJhbmlzYXRpb24gY2F0ZWdvcnkiKSsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LGhqdXN0PTEpKSArDQogIGdndGl0bGUoInNwaWRlciBjcm9zcyBsZW5ndGggcGVyIHVyYmFuaXNhdGlvbiBjYXRlZ29yeSIpDQpgYGANCg0KIyMjIGNyb3NzIHdpZHRoDQpgYGB7ciBjcm9zc193aWR0aH0NCiNjcm9zcyB3aWR0aCANCmdncGxvdChkYXRhX2J6LCBhZXMoVV9sb2NhbCwgY3Jvc3Nfd2lkdGgsIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSsNCiAgZmFjZXRfd3JhcCh+cGxvdGlkKSsNCiAgeWxhYigiY3Jvc3Mgd2lkdGggKG1tKSIpKw0KICB4bGFiKCJ1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbG9jYWwgc2NhbGUiKSsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LGhqdXN0PTEpKSArDQogIGdndGl0bGUoImNyb3NzIHdpZHRoIikNCg0KZ2dwbG90KGRhdGFfYnosIGFlcyhVX2xhbmRzY2FwZSwgY3Jvc3Nfd2lkdGgsIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSsNCiAgeWxhYigiY3Jvc3Mgd2lkdGggKG1tKSIpKw0KICB4bGFiKCJ1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbGFuZHNjYXBlIHNjYWxlIikrDQogIHRoZW1lX2J3KCkgKw0KICBnZ3RpdGxlKCJjcm9zcyB3aWR0aCIpDQoNCmdncGxvdChkYXRhX2J6LCBhZXModXJiX2NhdCwgY3Jvc3Nfd2lkdGgsIGZpbGw9dXJiX2NhdCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2w5LCBuYW1lPSJ1cmJhbmlzYXRpb24gXG5jYXRlZ29yeSIpKw0KICB5bGFiKCJjcm9zcyB3aWR0aCAobW0pIikrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBjYXRlZ29yeSIpKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsaGp1c3Q9MSkpICsNCiAgZ2d0aXRsZSgic3BpZGVyIGNyb3NzIHdpZHRoIHBlciB1cmJhbmlzYXRpb24gY2F0ZWdvcnkiKQ0KYGBgDQoNCm1heWJlIGJldHRlciB0byBzY2FsZSB0aGUgY3Jvc3MgbGVuZ3RoIHRvIHRoZSBwcm9wb3J0aW9uIGl0IHRha2VzIG9mIHRoZQ0KYWJkb21lbiBvciBvZiB0aGUgc3BpZGVyIHZpc3VhbGlzZWQgaGVyZSANCg0KIyMjIGNvcnJlY3RlZCBjcm9zc2xlbmd0aA0KYGBge3IgY3Jvc3NsZW5ndGhfY29ycn0NCiMjIyBjb3JyZWN0IGNyb3NzIGxlbmd0aCBhbmQgY3Jvc3Mgd2lkdGggd2l0aCBsZW5ndGggbWVhc3VyZW1lbnQgb2YgYWJkb21lbiBsZW5ndGggb3Igc3BpZGVyIGxlbmd0aA0KZGF0YV9ieiA8LSBkYXRhX2J6ICU+JSANCiAgbXV0YXRlKGNyb3NzX2xfY29ycl9hYmQ9Y3Jvc3NfbGVuZ3RoL2FiZG9tZW5fbGVuZ3RoLCANCiAgICAgICAgIGNyb3NzX2xfY29ycl9zcGk9Y3Jvc3NfbGVuZ3RoL3NwaWRlcl9sZW5ndGgpDQogICAgIA0KYzEgPC0gZ2dwbG90KGRhdGFfYnosIGFlcyhVX2xhbmRzY2FwZSwgY3Jvc3NfbF9jb3JyX2FiZCwgZmlsbD0gVV9sb2NhbCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2wzLCBuYW1lPSJVcmJhbmlzYXRpb24gbGV2ZWwgYXQgbG9jYWwgc2NhbGUiKSsNCiAgeWxhYigicHJvcCBjcm9zcyBsZW5ndGggLyBhYmRvbWVuIGxlbmd0aCIpKw0KICB4bGFiKCJ1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbGFuZHNjYXBlIHNjYWxlIikrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9cmVsKDEpKSkrDQogIGdndGl0bGUoImNyb3NzIGxlbmd0aCBjb3JyZWN0ZWQgYnkgYWJkb21lbiBsZW5ndGgiKSAgDQoNCmMyIDwtIGdncGxvdChkYXRhX2J6LCBhZXMoVV9sYW5kc2NhcGUsIGNyb3NzX2xfY29ycl9zcGksIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0iVXJiYW5pc2F0aW9uIGxldmVsIGF0IGxvY2FsIHNjYWxlIikrDQogIHlsYWIoTlVMTCkrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsYW5kc2NhcGUgc2NhbGUiKSsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT1yZWwoMSkpKSsNCiAgZ2d0aXRsZSgiY3Jvc3MgbGVuZ3RoIGNvcnJlY3RlZCBieSBzcGlkZXIgbGVuZ3RoIikNCmxpYnJhcnkoZ2dwdWJyKQ0KZ2dhcnJhbmdlKGMxLCBjMiwgbmNvbD0yLCBjb21tb24ubGVnZW5kPVQsIGxlZ2VuZD0iYm90dG9tIikNCmBgYA0KDQphcyB0b3RhbCBzcGlkZXIgbGVuZ3RoIHdhcyBsZXNzIGFjY3VyYXRlIHRvIG1lYXN1cmUsIHBvc2l0aW9uaW5nIHNwaWRlcg0KcGxheXMgYSByb2xlLCBhYmRvbWVuIGNvcnJlY3RlZCBpcyBoZXJlIG1vc3Qgc3VpdGFibGUgaSB0aGluaw0KDQpib3RoIHNob3cgcm91Z2x5IHRoZSBzYW1lIHRyZW5kcyANCg0KDQojIyNzdGF0aXN0aWNzDQoNCnN0YXRpc3RpY3MgbWFrZSB1c2Ugb2YgZ2xtbVRNQiBtdWx0aXBsZSBvYnNlcnZhdGlvbiBmb3IgZWFjaCBzdWJwbG90aWQNCg0KZmlyc3QgY2hlY2sgY29ycmVsYXRpb24gb2Ygc2FtcGxpbmcgZGF5IHdpdGggdGhlIGJvZHkgc2l6ZSBtZWF1cmVtZW50cy4NCkhvd2V2ZXIgb25seSB2ZXJ5IG1pbm9yIGNvcnJlbGF0aW9uIHByZXNlbnQgDQoNCmBgYHtyIGNvcnJlbGF0aW9uX2J6fQ0KIyMjIGNoZWNrIGZvciBjb3JyZWxhdGlvbjogIyMgYm9keSBzaXplIG1lYXN1cmVtZW50cyBhbmQgc2FtcGxpbmcgZGF5DQpsaWJyYXJ5KGNvcnJwbG90KQ0KZGYgPC0gZGF0YV9ieiAlPiUNCiAgc2VsZWN0KHNwaWRlcl9sZW5ndGgsIGFiZG9tZW5fbGVuZ3RoLCBhYmRvbWVuX2FyZWEsIGNyb3NzX2xlbmd0aCwgY3Jvc3NfbF9jb3JyX2FiZCwgY3Jvc3NfbF9jb3JyX3NwaSwgY3Jvc3Nfd2lkdGgsIGRheSkNCmJ6X2NvcjwtY29yKGRmLCBtZXRob2QgPSAicGVhcnNvbiIpDQpjb3JycGxvdChiel9jb3IsbWV0aG9kID0gImNpcmNsZSIsYWRkZ3JpZC5jb2w9ImdyZXkiLGFkZENvZWYuY29sID0gImJsYWNrIixudW1iZXIuY2V4ID0gMC44LCB0eXBlPSJ1cHBlciIpDQoNCmJ6X2NvcjwtY29yKGRmLCBtZXRob2QgPSAic3BlYXJtYW4iKQ0KY29ycnBsb3QoYnpfY29yLG1ldGhvZCA9ICJjaXJjbGUiLGFkZGdyaWQuY29sPSJncmV5IixhZGRDb2VmLmNvbCA9ICJibGFjayIsbnVtYmVyLmNleCA9IDAuOCwgdHlwZT0idXBwZXIiKQ0KDQpwbG90KGRmJHNwaWRlcl9sZW5ndGh+ZGYkZGF5KQ0KcGxvdChkZiRjcm9zc193aWR0aH5kZiRkYXkpDQpgYGANCg0KdGhhdCdzIHdoeSBpIGRvbid0IGluY2x1ZGUgZGF5IChzY2FsZWQgc2FtcGxpbmcgZGF5KSBpbiB0aGUgc3RhdGlzdGljYWwgbW9kZWxzIA0KDQpgYGB7cn0NCiMjIG1ha2Ugc2RheSB2YXJpYWJsZSBpZiB5b3Ugd291bGQgbGlrZSB0byBjaGVjayANClNDMjFfZGF0YSRzZGF5IDwtIHNjYWxlKFNDMjFfZGF0YSRkYXkpDQpkYXRhX2J6JHNkYXkgPC0gc2NhbGUoZGF0YV9ieiRkYXkpDQpgYGANCg0KIyMjIHN0YXRpc3RpY3Mgc3BpZGVyIGxlbmd0aA0KYGBge3Igc3RhdGlzdGljc19zcGlkZXJsZW5ndGh9DQojbG9hZCBwYWNrYWdlcyANCmxpYnJhcnkoREhBUk1hKSANCmxpYnJhcnkoZ2xtbVRNQikgDQpsaWJyYXJ5KGNhcikgICMjIGZvciB0aGUgQW5vdmENCmxpYnJhcnkoZW1tZWFucykNCmxpYnJhcnkocGVyZm9ybWFuY2UpIA0KbGlicmFyeShlZmZlY3RzKQ0KDQptb2RBIDwtIGdsbW1UTUIoc3BpZGVyX2xlbmd0aCB+IFVfbGFuZHNjYXBlK1VfbG9jYWwrKDF8cGxvdGlkL2xvY2F0aW9uKSwgZGF0YT1kYXRhX2J6LCBmYW1pbHk9Z2F1c3NpYW4pICNubyBpbnRlcmFjdGlvbiBiZXR3ZWVuIFVfbGFuZHNjYXBlIGFuZCBVX2xvY2FsDQpzdW1tYXJ5KG1vZEEpDQpBbm92YShtb2RBLCB0eXBlPSIzIikgICAjIyBVX2xhbmRzY2FwZSBpcyBzaWduaWZpY2FudA0KcGxvdChzaW11bGF0ZVJlc2lkdWFscyhtb2RBKSkNCnBsb3QoYWxsRWZmZWN0cyhtb2RBKSkNCg0KY29udHJhc3QoZW1tZWFucyhtb2RBLCBzcGVjcz1+VV9sYW5kc2NhcGUpLG1ldGhvZD0icGFpcndpc2UiKSAgIyMgZGlmZmVyZW5jZSBiZXR3ZWVuIG1lZGl1bSBhbmQgaGlnaCB1cmJhbmlzZWQgbGFuZHNjYXBlcw0KDQpwcmVkc19VX2xhbmRzY2FwZSA8LSBlbW1lYW5zKG1vZEEsIHNwZWNzID0gflVfbGFuZHNjYXBlLCB0eXBlID0gInJlc3BvbnNlIikgfD4NCiAgYXNfdGliYmxlKCkNCg0KZ19sYW5kIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBwcmVkc19VX2xhbmRzY2FwZSwgYWVzKHggPSBVX2xhbmRzY2FwZSwgeT1lbW1lYW4sIHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMKSwgc2l6ZSA9IDEsIHBjaCA9IDIxLCBmaWxsID0gdXJiLmNvbDMpKw0KICBsYWJzKHggPSAidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSIsIHkgPSAic3BpZGVyIGxlbmd0aCAobW0pIiApKw0KICBnZ3RpdGxlKCJlZmZlY3Qgb2YgdXJiYW5pc2F0aW9uIGF0IGxhbmRzY2FwZSBzY2FsZSBvbiBzcGlkZXIgbGVuZ3RoIikrDQogIHRoZW1lX2J3KCkNCmdfbGFuZA0KYGBgDQoNCnJhbmRvbSBmYWN0b3I6ICoqKDF8cGxvdGlkL2xvY2F0aW9uKSoqIDogcGxvdGlkIChQMDEtUDI3KSBhbmQgbG9jYXRpb24gKFAwMVNHLCAuLiwgUDI3U1IpDQpmaXhlZCBlZmZlY3RzOiB1cmJhbmlzYXRpb24gbGV2ZWxzIGF0IGxhbmRzY2FwZSBhbmQgbG9jYWwgc2NhbGUgOiBVX2xhbmRzY2FwZSBhbmQgVV9sb2NhbCANCg0KKipSZXN1bHQ6KioNCioqc3BpZGVyIGxlbmd0aCA6IHNwaWRlcnMgYmVjb21lIGJpZ2dlciB3aXRoIGluY3JlYXNpbmcgdXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSwgYnV0IG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIG1lZGl1bSBhbmQgaGlnaCB1cmJhbmlzZWQgbGFuZHNjYXBlcyBhcmUgc2lnbmlmaWNhbnQqKg0KDQoNCiMjIyBhYmRvbWVuIGxlbmd0aCAtIHN0YXRpc3RpY3MNCnNwaWRlciBsZW5ndGggc29tZXRpbWVzIGRpZmZpY3VsdCB0byBhY2N1cmF0ZWx5IG1lYXN1cmUuIG1heWJlIGFiZG9tZW4gbGVuZ3RoDQppcyBzb21laG93IG1lYXN1cmVkIG1vcmUgY29tcGFyYWJsZSANCg0KYGBge3Igc3RhdF9hYmRvbWVubGVuZ3RofQ0KbW9kQSA8LSBnbG1tVE1CKGFiZG9tZW5fbGVuZ3RoIH4gVV9sYW5kc2NhcGUrVV9sb2NhbCsoMXxwbG90aWQvbG9jYXRpb24pLCBkYXRhPWRhdGFfYnosIGZhbWlseT1nYXVzc2lhbikgI25vIGludGVyYWN0aW9uIGJldHdlZW4gVV9sYW5kc2NhcGUgYW5kIFVfbG9jYWwgDQpzdW1tYXJ5KG1vZEEpDQpBbm92YShtb2RBLCB0eXBlPSIzIikgICAjIyBub3RoaW5nIHNpZ25pZmljYW50bHkgZGlmZmVyZW50DQpwbG90KHNpbXVsYXRlUmVzaWR1YWxzKG1vZEEpKQ0KcGxvdChhbGxFZmZlY3RzKG1vZEEpKQ0KYGBgDQoNCg0KIyMjYWJkb21lbiBhcmVhIC0gc3RhdGlzdGljcw0KYWJkb21lbiBhcmVhIGFzIGEgcG90ZW50aWFsIG1lYXN1cmUgb2YgZmVjdW5kaXR5DQoNCmBgYHtyIHN0YXRpc3RpY3NfYWJkb21lbmFyZWF9DQptb2RCIDwtIGdsbW1UTUIoYWJkb21lbl9hcmVhIH4gVV9sYW5kc2NhcGUrVV9sb2NhbCsoMXxwbG90aWQvbG9jYXRpb24pLCBkYXRhPWRhdGFfYnosIGZhbWlseT1nYXVzc2lhbikgI3dpdGhvdXQgaW50ZXJhY3Rpb24gdGVybQ0Kc3VtbWFyeShtb2RCKQ0KQW5vdmEobW9kQiwgdHlwZT0iMyIpICANCnBsb3Qoc2ltdWxhdGVSZXNpZHVhbHMobW9kQikpDQpwbG90KGFsbEVmZmVjdHMobW9kQikpDQpgYGANCm5vIGRpZmZlcmVuY2VzIGluIGFiZG9tZW4gYXJlYQ0KDQoNCiMjIGNvbG91cg0KY2hlY2sgZm9yIHN0cmFuZ2UgdmFsdWVzIGFsdGhvdWdoIHRoZSBjb2xvdXIgY29ycmVjdGlvbiBpcyBleGVjdXRlZC4gDQpJbiBxdWl0ZSBhIGxvdCBvZiBwaWN0dXJlcyB0aGUgZ3JleSBzY2FsZSBpcyBibHVycnkgYW5kIGluIHNvbWUgYWxzbyB0aGUgc3BpZGVyDQoNCiMjI2V4cGxvcmF0aW9uDQpgYGB7ciBjb2xfZXhwbG9yYXRpb259DQojIyBpbiBjb2xfY29ycl9hYmQNCnN1bW1hcnkoU0MyMV9kYXRhJGNvbF9jb3JyX2FiZGJyaSkgICAjbWFqb3JpdHkgb2YgdGhlIHNhbXBsZXMgYmV0d2VlbiAxMCAtIDQwICh0aGlzIHJlcHJlc2VudCB0aGUgY2FsaWJyYXRlZCByZWZsZWN0YW5jZSB2YWx1ZXMpDQpwbG90KFNDMjFfZGF0YSRjb2xfY29ycl9hYmRicmkgfiBTQzIxX2RhdGEkbG9jYXRpb24pDQoNCmZfY29sIDwtIGMoIlNDMjFQMjRTUjA1IiwgIlNDMjFQMjJTUjE4IiwgIlNDMjFQMjFTRzEyIiwgIlNDMjFQMTBTUjE1IikNCmRhdGFfY29sIDwtIFNDMjFfZGF0YSAlPiUgDQogIGRwbHlyOjpmaWx0ZXIoIXNwaWRlcklEICVpbiUgZl9jb2wpICAgDQpgYGANClNDMjFQMTBTUjE1ID0+IHNwaWRlciBpcyBwYWxlIGJ1dCBub3QgdGhhdCBwYWxlIA0KYWxzbyBub3QgdGhhdCBwYWxlIDogU0MyMVAyNFNSMDUsIFNDMjFQMjJTUjE4DQpTQzIxUDIxU0cxMiA9PiBpcyBub3QgdGhhdCBkYXJrIHNwaWRlcg0KDQpkYXRhc2V0IGZvciB0aGUgY29sb3VyIGFuYWx5c2lzIDogZGF0YV9jb2wNCmRhdGFfY29sIGNvbnRhaW4gMTM4MCBzcGlkZXJzISAoaW5zdGVhZCBvZiAxMzgzIHNwaWRlciwgZGF0YV9ieiBjb250YWlucyAxMzc2IHNwaWRlcnMpDQoNCiMjI2NvcnJlbGF0aW9uDQpgYGB7ciBjb3JyZWxhdGlvbl9jb2xvdXJ9DQpkZl9jb2xvdXIgPC0gZGF0YV9jb2wgJT4lDQogIHNlbGVjdChjb2xfY29ycl9hYmRicmksIGNvbF9jb3JyX2Nyb3NzLCBjb2xfY29ycl9sZWFmZGFyaywgY29sX2NvcnJfbGVhZmxpZ2h0LCBkYXkpDQoNCmNvbG91cl9jb3I8LWNvcihkZl9jb2xvdXIsIG1ldGhvZCA9ICJwZWFyc29uIikNCmNvcnJwbG90KGNvbG91cl9jb3IsbWV0aG9kID0gImNpcmNsZSIsYWRkZ3JpZC5jb2w9ImdyZXkiLGFkZENvZWYuY29sID0gImJsYWNrIixudW1iZXIuY2V4ID0gMC44LCB0eXBlPSJ1cHBlciIpDQoNCmNvbG91cl9jb3I8LWNvcihkZl9jb2xvdXIsIG1ldGhvZCA9ICJzcGVhcm1hbiIpDQpjb3JycGxvdChjb2xvdXJfY29yLG1ldGhvZCA9ICJjaXJjbGUiLGFkZGdyaWQuY29sPSJncmV5IixhZGRDb2VmLmNvbCA9ICJibGFjayIsbnVtYmVyLmNleCA9IDAuOCwgdHlwZT0idXBwZXIiKQ0KDQpwbG90KGRmX2NvbG91ciRjb2xfY29ycl9hYmRicml+ZGZfY29sb3VyJGRheSkNCmBgYA0Kbm8gdHJlbmRzIHdpdGggZGF5IChzYW1wbGluZyBkYXkpLg0KSG93ZXZlciwgdGhlcmUgaXMgYSBzdHJvbmcgcG9zaXRpdmUgY29ycmVsYXRpb24NCmJldHdlZW4gYWJkb21lbiBicmlnaHRuZXNzIGFuZCBsZWFmZGFyaywgYWJkb21lbiBicmlnaHRuZXNzIGFuZCBsZWFmbGlnaHQgPT4NCioqY29ycmVsYXRpb246IHRoZSBwYWxlciB0aGUgc3BpZGVyIGFsc28gdGhlIHBhbGVyIHRoZSBsZWFmZGFyayBhbmQgbGVhZmxpZ2h0KioNCmBgYHtyIGNvcnJlbGF0aW9uX2NvbG91cjJ9DQpwbG90KGRmX2NvbG91ciRjb2xfY29ycl9hYmRicml+ZGZfY29sb3VyJGNvbF9jb3JyX2xlYWZkYXJrKQ0KcGxvdChkZl9jb2xvdXIkY29sX2NvcnJfYWJkYnJpfmRmX2NvbG91ciRjb2xfY29ycl9sZWFmbGlnaHQpDQpgYGANCg0KKipjb3JyZWxhdGlvbjogdGhlIHBhbGVyIHRoZSBsZWFmZGFyayBhbHNvIHRoZSBwYWxlciB0aGUgbGVhZmxpZ2h0KioNCmBgYHtyIGNvcnJlbGF0aW9uX2NvbG91cjN9DQpwbG90KGRmX2NvbG91ciRjb2xfY29ycl9sZWFmZGFya35kZl9jb2xvdXIkY29sX2NvcnJfbGVhZmxpZ2h0KQ0KYGBgDQoNCioqbm8gY29ycmVsYXRpb24gd2l0aCBjb2xvdXIgb2YgdGhlIGNyb3NzKiogdGhlc2UgdmFsdWVzIGFyZSBzdGlsbCBzdHJhbmdlDQphbHRob3VnaCBjb3JyZWN0aW9uIHdhcyBhcHBsaWVkIGluIHRoZSBzYW1lIHdheSBhcyBmb3IgY29sX2NvcnJfbGVhZmRhcmsgYW5kDQpjb2xfY29ycl9sZWFmZGFyayA9PiBtYXliZSBvbmx5IGZvY3VzIG9uICUgcmVmbGVjdGFuY2Ugb2YgYWJkb21lbiAhIA0KIA0KQWdhaW4gMyB0eXBlIG9mIHZpc3VhbGlzYXRpb24gZ3JhcGhzIGFuZCBhZnRlciB0aGF0IHRoZSBzdGF0aXN0aWNhbCB0ZXN0IA0KIA0KYGBge3IgY29sX3JlZmxlY3RhbmNlfQ0KI3JlZmxlY3RhbmNlIA0KZ2dwbG90KGRhdGFfY29sLCBhZXMoVV9sb2NhbCwgY29sX2NvcnJfYWJkYnJpLCBmaWxsPVVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gdXJiLmNvbDMsIG5hbWU9InVyYmFuaXNhdGlvbiBsZXZlbCBcbmF0IGxvY2FsIHNjYWxlIikgKw0KICBmYWNldF93cmFwKH5wbG90aWQpKw0KICB5bGFiKCJyZWZsZWN0YW5jZSAoJSkiKSsNCiAgeGxhYigidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxvY2FsIHNjYWxlIikrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSxoanVzdD0xKSkgKw0KICBnZ3RpdGxlKCJzcGlkZXIgYWJkb21lbiByZWZsZWN0YW5jZSIpDQoNCmdncGxvdChkYXRhX2NvbCwgYWVzKFVfbGFuZHNjYXBlLCBjb2xfY29ycl9hYmRicmksIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0iVXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSsNCiAgeWxhYigicmVmbGVjdGFuY2UgKCUpIikrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsYW5kc2NhcGUgc2NhbGUiKSsNCiAgdGhlbWVfYncoKSsNCiAgZ2d0aXRsZSgic3BpZGVyIGFiZG9tZW4gcmVmbGVjdGFuY2UiKQ0KDQpnZ3Bsb3QoZGF0YV9jb2wsIGFlcyh1cmJfY2F0LCBjb2xfY29ycl9hYmRicmksIGZpbGw9dXJiX2NhdCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZW9tX2ppdHRlcihzaXplPTAuOSwgd2lkdGg9MC4yNSkrICNzaWxlbmNlIGZvciBqdXN0IGJveHBsb3QgZmlndXJlDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gdXJiLmNvbDksIG5hbWU9InVyYmFuaXNhdGlvbiBcbmNhdGVnb3J5IikrDQogIHlsYWIoInJlZmxlY3RhbmNlICglKSIpKw0KICB4bGFiKCJ1cmJhbmlzYXRpb24gY2F0ZWdvcnkiKSsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LGhqdXN0PTEpKSArDQogIGdndGl0bGUoInNwaWRlciBhYmRvbWVuIHJlZmxlY3RhbmNlIHBlciB1cmJhbmlzYXRpb24gY2F0ZWdvcnkiKQ0KYGBgDQoNCiMjIyBjb21wYXJpc29uIGRhdGFfY29sIGFuZCBmaWx0ZXJlZCBkYXRhc2V0IGRhdGFfY29sX2ZpbHQNCnRoZSBzYW1lIGRhdGFzZXQgYnV0IG5vdyB3aXRoIHNvbWUgbW9yZSBzdHJpY3QgZmlsdGVyaW5nIG9mIGV4dHJlbWVzIChwcm9iYWJseSBkdWUgdG8gcGhvdG8gcXVhbGl0eSkNCnNvIGV2ZXJ5dGhpbmcgdW5kZXIgMTAgYW5kIGV2ZXJ5dGhpbmcgYWJvdmUgMzUgPT4gZGF0YXNldCA6IGRhdGFfY29sX2ZpbHQ6IGNvbnRhaW5zIDEzMzcgb2JzZXJ2YXRpb25zKD1zcGlkZXJzKQ0KYGBge3IgZGF0YV9jb21wfQ0KZGF0YV9jb2xfZmlsdCA8LSBkYXRhX2NvbCAlPiUNCiAgZmlsdGVyKGNvbF9jb3JyX2FiZGJyaSA8PSAzNSAmIGNvbF9jb3JyX2FiZGJyaSA+PSAxMCkNCg0KcGxvdChkYXRhX2NvbF9maWx0JGNvbF9jb3JyX2FiZGJyaSB+IGRhdGFfY29sX2ZpbHQkbG9jYXRpb24pDQoNCmRpbShkYXRhX2NvbCkNCmRpbShkYXRhX2NvbF9maWx0KQ0KDQpHMTwtZ2dwbG90KGRhdGFfY29sLCBhZXMoVV9sYW5kc2NhcGUsIGNvbF9jb3JyX2FiZGJyaSwgZmlsbD0gVV9sb2NhbCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2wzLCBuYW1lPSJVcmJhbmlzYXRpb24gbGV2ZWwgbmF0IGxvY2FsIHNjYWxlIikrDQogIHlsYWIoInJlZmxlY3RhbmNlICglKSIpKw0KICB4bGFiKCJ1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbGFuZHNjYXBlIHNjYWxlIikrDQogIHlsaW0oMCw1NSkrDQogIHRoZW1lX2J3KCkrDQogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9cmVsKDEpKSkrDQogIGdndGl0bGUoInNwaWRlciBhYmRvbWVuIHJlZmxlY3RhbmNlIDogZGF0YV9jb2wgZGF0YXNldCIpDQoNCkcyPC1nZ3Bsb3QoZGF0YV9jb2xfZmlsdCwgYWVzKFVfbGFuZHNjYXBlLCBjb2xfY29ycl9hYmRicmksIGZpbGw9IFVfbG9jYWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSB1cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIGF0IGxvY2FsIHNjYWxlIikrDQogIHlsYWIoTlVMTCkrDQogIHlsaW0oMCw1NSkrDQogIHhsYWIoInVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsYW5kc2NhcGUgc2NhbGUiKSsNCiAgdGhlbWVfYncoKSsNCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1yZWwoMSkpKSsNCiAgZ2d0aXRsZSgic3BpZGVyIGFiZG9tZW4gcmVmbGVjdGFuY2UgOiBkYXRhX2NvbF9maWx0IGRhdGFzZXQiKQ0KDQpnZ2FycmFuZ2UoRzEsIEcyLCBuY29sPTIsIGNvbW1vbi5sZWdlbmQ9VCwgbGVnZW5kPSJib3R0b20iKQ0KYGBgDQoNCiMjIyBjb2xfZmlsdCBleHBsb3JhdGlvbg0KdGhlIHNhbWUgMyBncmFwaCB2aXN1YWxpc2F0aW9ucyBmb3IgdGhlIGZpbHRlcmVkIGRhdGFzZXQgKyB2aW9saW4NCmBgYHtyIGNvbF9maWx0X3JlZmxlY3RhbmNlfQ0KI3JlZmxlY3RhbmNlIA0KZ2dwbG90KGRhdGFfY29sX2ZpbHQsIGFlcyhVX2xvY2FsLCBjb2xfY29ycl9hYmRicmksIGZpbGw9VV9sb2NhbCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZW9tX2ppdHRlcihzaXplPTAuOSwgd2lkdGg9MC4yNSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHVyYi5jb2wzLCBuYW1lPSAidXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSArDQogIGZhY2V0X3dyYXAofnBsb3RpZCkrDQogIHlsYWIoInJlZmxlY3RhbmNlICglKSIpKw0KICB4bGFiKCJ1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbG9jYWwgc2NhbGUiKSsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LGhqdXN0PTEpKSArDQogIGdndGl0bGUoInNwaWRlciBhYmRvbWVuIHJlZmxlY3RhbmNlIChmaWx0ZXJlZCBkYXRhc2V0KSIpDQoNCmdncGxvdChkYXRhX2NvbF9maWx0LCBhZXMoVV9sYW5kc2NhcGUsIGNvbF9jb3JyX2FiZGJyaSwgZmlsbD0gVV9sb2NhbCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2wzLCBuYW1lPSJ1cmJhbmlzYXRpb24gbGV2ZWwgXG5hdCBsb2NhbCBzY2FsZSIpKw0KICB5bGFiKCJyZWZsZWN0YW5jZSAoJSkiKSsNCiAgeGxhYigidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSIpKw0KICB0aGVtZV9idygpKw0KICBnZ3RpdGxlKCJzcGlkZXIgYWJkb21lbiByZWZsZWN0YW5jZSAoZmlsdGVyZWQgZGF0YXNldCkiKQ0KDQpnZ3Bsb3QoZGF0YV9jb2xfZmlsdCwgYWVzKHVyYl9jYXQsIGNvbF9jb3JyX2FiZGJyaSwgZmlsbD11cmJfY2F0KSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21faml0dGVyKHNpemU9MC45LCB3aWR0aD0wLjI1KSsgI3NpbGVuY2UgdGhpcyBmb3IganVzdCBib3hwbG90IGZpZ3VyZQ0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IHVyYi5jb2w5LCBuYW1lPSJ1cmJhbmlzYXRpb24gXG5jYXRlZ29yeSIpKw0KICB5bGFiKCJyZWZsZWN0YW5jZSAoJSkiKSsNCiAgeGxhYigidXJiYW5pc2F0aW9uIGNhdGVnb3J5IikrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSxoanVzdD0xKSkgKw0KICBnZ3RpdGxlKCJzcGlkZXIgYWJkb21lbiByZWZsZWN0YW5jZSAoZmlsdGVyZWQgZGF0YXNldCkiKQ0KYGBgDQoNCiMjI3N0YXRpc3RpY3MNCiMjI3N0YXRpc3RpY3MgLSBkYXRhX2NvbA0Kc3RhdGlzdGljcyBvbiBhYmRvbWVuIGJyaWdodG5lc3M6IG5vdyBleHByZXNzZWQgYXMgcmVmbGVjdGFuY2UNCmBgYHtyIHN0YXRfZGF0YV9jb2xfMX0NCm1vZEEgPC0gZ2xtbVRNQihjb2xfY29ycl9hYmRicmkgfiBVX2xhbmRzY2FwZSpVX2xvY2FsKygxfHBsb3RpZC9sb2NhdGlvbiksIGRhdGE9ZGF0YV9jb2wsIGZhbWlseT1nYXVzc2lhbikgI3dpdGggaW50ZXJhY3Rpb24gdGVybSANCnN1bW1hcnkobW9kQSkNCkFub3ZhKG1vZEEsIHR5cGU9IjMiKSAjaW50ZXJhY3Rpb24gc2lnbmlmaWNhbnQNCnBsb3Qoc2ltdWxhdGVSZXNpZHVhbHMobW9kQSkpDQoNCnBsb3QoYWxsRWZmZWN0cyhtb2RBKSkNCg0KbW9kQV9jb21wIDwtIGNvbnRyYXN0KGVtbWVhbnMobW9kQSwgc3BlY3M9flVfbGFuZHNjYXBlKlVfbG9jYWwpLCBtZXRob2Q9InBhaXJ3aXNlIikgfD4gYXNfdGliYmxlKCkgJT4lIGtuaXRyOjprYWJsZSgpDQpgYGANCm9yZGVyIHRoaXMgdGFibGUgKG5vdGhpbmcgaXMgc2lnbmlmaWNhbnQgd2hlbiBtdWx0aXBsZSBjb21wYXJpc29ucyBhcmUgdXNlZCkNCmBgYHtyIHN0YXRfZGF0YV9jb2xfMn0NCiNtb2RBX2NvbXBbb3JkZXIobW9kQV9jb21wJHAudmFsdWUsIGRlY3JlYXNpbmc9RiksIF0gJT4lIGtuaXRyOjprYWJsZSgpICAjIGdldCB3aGljaCBsb2NhdGlvbiBjb21wYXJpc29ucyBhcmUgc2lnbmlmaWNhbnRseSAgKG9yIG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQpDQpgYGANCg0KdmlzdWFsaXNhdGlvbg0KYGBge3Igc3RhdF9kYXRhX2NvbF8zfQ0KY29sXzE8LWdncHJlZGljdChtb2RBLCB0ZXJtcz1jKCJVX2xhbmRzY2FwZSIsICJVX2xvY2FsIikpIHw+IHBsb3QoKSArIGxhYnMoeD0idXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSIsIHk9InJlZmxlY3RhbmNlICglKSIsIHRpdGxlPSJlZmZlY3Qgb2YgdXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBhbmQgbG9jYWwgc2NhbGUgb24gc3BpZGVyIGFiZG9tZW4gcmVmbGVjdGFuY2UiKSAgKyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz11cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIFxuYXQgbG9jYWwgc2NhbGUiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz11cmIuY29sMykgDQpjb2xfMQ0KDQpwcmVkc19tb2RBIDwtIGVtbWVhbnMobW9kQSwgc3BlY3M9flVfbGFuZHNjYXBlKlVfbG9jYWwsIG1ldGhvZD0icmVzcG9uc2UiKSB8PiBhc190aWJibGUoKQ0KcHJlZHNfbW9kQQ0KZ19tb2RBPC1nZ3Bsb3QoKSArDQogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gcHJlZHNfbW9kQSwgYWVzKHggPSBVX2xhbmRzY2FwZSwgeT1lbW1lYW4sIHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMLCBmaWxsPVVfbG9jYWwpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpLCBzaXplID0gMSwgcGNoID0gMjEpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9dXJiLmNvbDMsIG5hbWU9InVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsb2NhbCBzY2FsZSIpKw0KICBsYWJzKHggPSAidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSIsIHkgPSAicmVmbGVjdGFuY2UgKCUpIiwgeWxpbT1jKDE4LDI2KSkrDQogIGdndGl0bGUoImVmZmVjdCBvZiB1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbGFuZHNjYXBlIGFuZCBsb2NhbCBzY2FsZSBvbiBzcGlkZXIgYWJkb21lbiByZWZsZWN0YW5jZSIpKw0KICB0aGVtZV9idygpDQpnX21vZEENCmBgYA0KaW50ZXJhY3Rpb24gaXMgc2lnbmlmaWNhbnQgaG93ZXZlciBvdXRsaWVyIHRlc3QgaXMgc2lnbmlmaWNhbnQgYW5kIEtTIHRlc3QgPT4gbWF5YmUgYmVzdCBjaGVjayB0cmVuZHMgd2l0aCBkYXRhX2NvbF9maWx0DQoNCnJlcGVhdCBzdGF0aXN0aWNzIGJ1dCB0aGFuIGZvciB0aGUgZmlsdGVyZWQgZGF0YXNldA0KIyMjc3RhdGlzdGljcyAtIGRhdGFfY29sX2ZpbHQNCmBgYHtyIHN0YXRfZGF0YV9jb2xfZmlsdH0NCm1vZEFfZmlsdCA8LSBnbG1tVE1CKGNvbF9jb3JyX2FiZGJyaSB+IFVfbGFuZHNjYXBlKlVfbG9jYWwrKDF8cGxvdGlkL2xvY2F0aW9uKSwgZGF0YT1kYXRhX2NvbF9maWx0LCBmYW1pbHk9Z2F1c3NpYW4pIA0Kc3VtbWFyeShtb2RBX2ZpbHQpIA0KQW5vdmEobW9kQV9maWx0LCB0eXBlPSIzIikgI2ludGVyYWN0aW9uIGlzIHNpZ25pZmljYW50IGFuZCBVX2xhbmRzY2FwZSBzaWduaWZpY2FudA0KcGxvdChzaW11bGF0ZVJlc2lkdWFscyhtb2RBX2ZpbHQpKQ0KDQpjb250cmFzdChlbW1lYW5zKG1vZEFfZmlsdCwgc3BlY3M9flVfbGFuZHNjYXBlKSxtZXRob2Q9InBhaXJ3aXNlIikgIyB2b2VydCBhdXRvbWF0aXNjaCBUdWtleSBjb3JyZWN0aWUgdWl0DQpjb250cmFzdChlbW1lYW5zKG1vZEFfZmlsdCwgc3BlY3M9flVfbGFuZHNjYXBlKlVfbG9jYWwpLG1ldGhvZD0icGFpcndpc2UiKQ0KDQptb2RBX2ZpbHRfY29tcCA8LSBjb250cmFzdChlbW1lYW5zKG1vZEFfZmlsdCwgc3BlY3M9flVfbGFuZHNjYXBlKlVfbG9jYWwpLCBtZXRob2Q9InBhaXJ3aXNlIikgfD4gYXNfdGliYmxlKCkNCm1vZEFfZmlsdF9jb21wICU+JSBmaWx0ZXIocC52YWx1ZSA8IDAuMDk5KSAlPiUga25pdHI6OmthYmxlKCkgICMgZ2V0IHdoaWNoIGxvY2F0aW9uIGNvbXBhcmlzb25zIGFyZSBzaWduaWZpY2FudGx5ICAob3IgbWFyZ2luYWxseSBzaWduaWZpY2FudCkNCmBgYA0KDQpkaWZmZXJlbmNlIGlzIGJldHdlZW4gbG9jYWwgbG93IHVyYmFuaXNhdGlvbiBsZXZlbCBhbmQgbG9jYWwgbWVkaXVtIHVyYmFuaXNhdGlvbiBsZXZlbCB3aXRoaW4gaGlnaGx5IHVyYmFuaXNlZCBsYW5kc2NhcGVzIA0KDQpidXQgc3RpbGwgb3V0bGllciB0ZXN0IHNpZ25pZmljYW50IGFuZCBrcyB0ZXN0IGFzIHdlbGwNCg0KYGBge3Igc3RhdF9kYXRhX2NvbF9maWx0XzJ9DQpwcmVkc19tb2RBX2ZpbHQgPC0gZW1tZWFucyhtb2RBX2ZpbHQsIHNwZWNzPX5VX2xhbmRzY2FwZSpVX2xvY2FsLCBtZXRob2Q9InJlc3BvbnNlIikgfD4gYXNfdGliYmxlKCkNCnByZWRzX21vZEFfZmlsdA0KDQpnX21vZEFfZmlsdDwtZ2dwbG90KCkgKw0KICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IHByZWRzX21vZEFfZmlsdCwgYWVzKHggPSBVX2xhbmRzY2FwZSwgeT1lbW1lYW4sIHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMLCBmaWxsPVVfbG9jYWwpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpLCBzaXplID0gMSwgcGNoID0gMjEpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9dXJiLmNvbDMsIG5hbWU9InVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsb2NhbCBzY2FsZSIpKw0KICBsYWJzKHggPSAidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSIsIHkgPSAicmVmbGVjdGFuY2UgKCUpIiwgeWxpbT1jKDE4LDI2KSkrDQogIGdndGl0bGUoImVmZmVjdCBvZiB1cmJhbmlzYXRpb24gb24gc3BpZGVyIGFiZG9tZW4gcmVmbGVjdGFuY2UgKGZpbHRlcmVkIGRhdGFzZXQiKSsNCiAgdGhlbWVfYncoKQ0KZ19tb2RBX2ZpbHQNCmBgYA0KDQpjb21wYXJpc29uIG9mIHRoZSBvdXRwdXRzIG9mIG1vZEEgYW5kIG1vZEFfZmlsdCwgc28gdGhlIG5vcm1hbCBjb2xvciBkYXRhc2V0IGFuZCB0aGUgZmlsdGVyZWQgY29sb3VyIGRhdGFzZXQNCmBgYHtyIHN0YXRfY29tcF9jb2xfYW5kX2NvbF9maWx0fQ0KIyMgY29tcGFyaXNvbiBvZiBib3RoIG91dHB1dHMgb2YgbW9kQSBhbmQgbW9kQSBmaWx0DQpnZ2FycmFuZ2UoZ19tb2RBLCBnX21vZEFfZmlsdCwgbmNvbD0yLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kPSJib3R0b20iKQ0KYGBgDQoNCioqaW4gc3VtbWFyeSoqDQpvbiB0aGUgZ3JhcGggYSB0cmVuZCBpcyB2aXNpYmxlOiANCi1pbiAqKmxvdyoqIHVyYmFuaXNlZCBsYW5kc2NhcGVzOiBzcGlkZXJzIHRlbmQgdG8gYmVjb21lIGRhcmtlciB3aXRoIGluY3JlYXNpbmcgdXJiYW5pc2F0aW9uIGxldmVsIGF0IGxvY2FsIHNjYWxlDQotaW4gKiptZWRpdW0qKiB1cmJhbmlzZWQgbGFuZHNjYXBlczogc3BpZGVycyB0ZW5kIHRvIGJlY29tZSAqKmRhcmtlcioqIHdpdGggaW5jcmVhc2luZyB1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbG9jYWwgc2NhbGUsIGhvd2V2ZXIgc3BpZGVycyBpbiB0aGUgbWVkaXVtIHVyYmFuaXNlZCBsb2NhdGlvbnMgYXJlIHRoZSBkYXJrZXN0LCANCi1pbiAqKmhpZ2gqKiB1cmJhbmlzZWQgbGFuZHNjYXBlczogc3BpZGVycyB0ZW5kIHRvIGJlY29tZSAqKnBhbGVyKiogd2l0aCBpbmNyZWFzaW5nIHVyYmFuaXNhdGlvbiBsZXZlbCwgaG93ZXZlciB0aGUgcmVmbGVjdGFuY2Ugb2Ygc3BpZGVycyBpbiBsb2NhbGx5IGhpZ2ggdXJiYW5pc2VkIGxvY2F0aW9ucyBpcyByb3VnaGx5IHRoZSBzYW1lIGFjcm9zcyB0aGUgdXJiYW5pc2F0aW9uIGxldmVscyBhdCBsYW5kc2NhcGUgc2NhbGUuIG1lYW5pbmcgdGhhdCBhbGwgInB1cnBsZSIgZG90cyBhcmUgcm91Z2hseSB0aGUgc2FtZSBhY3Jvc3MgdGhlIGxhbmRzY2FwZSB1cmJhbmlzYXRpb24gZ3JhZGllbnQuIEl0IGlzIG1haW5seSB0aGUgc3BpZGVycyBpbiB0aGUgbGVhc3QgdXJiYW5pc2VkIGxvY2F0aW9uIHRoYXQgYXJlIHZlcnkgZGFyayANCg0Kb3IgcmVwaHJhc2VkOiB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gaW5kaWNhdGVzIHRoYXQgZGVwZW5kaW5nIG9uIHRoZSBVX2xhbmRzY2FwZSBjb250ZXh0IHNvIHdoZXRoZXIgaXQgaXMgbG93Jm1lZGl1bSB2cyBoaWdoIHRoYXQgdGhlIGVmZmVjdCBvZiB1cmJhbmlzYXRpb24gb24gdGhlIGxvY2FsIHNjYWxlIGlzIGRpZmZlcmVudC4gaS5lLiBpbiBsb3cmbWVkaXVtIGxhbmRzY2FwZXMgdGhlIHNwaWRlcnMgaW4gdXJiYW5pc2VkIGxvY2FsIHNpdGVzIGFyZSBkYXJrZXIgdGhhbiB0aGVyZSBuYXR1cmFsIGNvdW50ZXJwYXJ0cyBidXQgaW4gaGlnaCB1cmJhbmlzZWQgbGFuZHNjYXBlcyB0aGUgc3BpZGVycyBpbiBsb2NhbCB1cmJhbiBhcmVhcyBhcmUgcGFsZXIgdGhhbiB0aGVyZSBuYXR1cmFsIGNvdW50ZXJwYXJ0LiBIb3dldmVyIGlmIHlvdSBjb21wYXJlIHRoZSB0aGlzIGhpZ2gtaGlnaCB0byB0aGUgb3RoZXJzIHRoZSBzcGlkZXJzIGFyZSBzdGlsbCBxdWl0ZSBkYXJrIGluIGEgdmVyeSB1cmJhbmlzZWQgc2V0dGluZyBjb21wYXJlZCB0byBvdGhlciB1YmFuaXNhdGlvbiBzZXR0aW5ncw0KDQpvbmx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2Ugd2FzIGZvdW5kIHdpdGhpbiB0aGUgaGlnaGx5IHVyYmFuaXNlZCBsYW5kc2NhcGVzOiBuYW1lbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHNwaWRlcnMgaW4gbG9jYWxseSBsb3cgdXJiYW5pc2VkIGFuZCBsb2NhbGx5IG1lZGl1bSB1cmJhbmlzZWQgbG9jYXRpb25zOg0KbG9jYWwgbG93IHVyYmFuaXNlZCBzcGlkZXJzICh2ZXJ5IGRhcmsgc3BpZGVycykgYW5kIGxvY2FsIG1lZGl1bSB1cmJhbmlzZWQgc3BpZGVycyAodmVyeSBsaWdodCBzcGlkZXJzKSBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudA0KDQoNCiMjIyBjb2xvdXIgLSBsZWFmZGFyayAtIGxlYWZsaWdodCAtIHN0YXRpc3RpY3MNCm1heWJlIGxlc3MgdXNlZnVsbCBiaWcgcmFuZ2Ugb2YgdmFsdWVzDQphcmUgYmFzZWQgb24gMyBwb2ludCBtZWFzdXJlbWVudHMgPT4gYXZlcmFnZSBvZiB0aGlzID0+IHRoaXMgYXZlcmFnZSB0aGVuIGNvcnJlY3RlZCBzbyB5b3UgZ2V0ICUgcmVmbGVjdGFuY2UNCiMjIyNzdGF0aXN0aWNzLWxlYWZsaWdodA0KYGBge3Igc3RhdF9sZWFmbGlnaHR9DQojbGVhZmxpZ2h0IChwb2ludCBtZWFzc3VyZW1lbnQpDQojZGF0YXNldCA6IGRhdGFfY29sDQpwbG90KGRhdGFfY29sJGNvbF9jb3JyX2xlYWZsaWdodH5kYXRhX2NvbCRsb2NhdGlvbikgICMjIGJpZyByYW5nZSBvZiB2YWx1ZXMNCm1vZEFfbGlnaHQgPC0gZ2xtbVRNQihjb2xfY29ycl9sZWFmbGlnaHQgfiBVX2xhbmRzY2FwZSpVX2xvY2FsKygxfHBsb3RpZC9sb2NhdGlvbiksIGRhdGE9ZGF0YV9jb2wsIGZhbWlseT1nYXVzc2lhbikgDQpzdW1tYXJ5KG1vZEFfbGlnaHQpDQpBbm92YShtb2RBX2xpZ2h0LCB0eXBlPSIzIikgICMgVV9sYW5kc2NhcGUgYW5kIGludGVyYWN0aW9uIHNpZ25pZmljYW50DQpwbG90KHNpbXVsYXRlUmVzaWR1YWxzKG1vZEFfbGlnaHQpKQ0KDQpsbF9jb21wPC1jb250cmFzdChlbW1lYW5zKG1vZEFfbGlnaHQsIHNwZWNzPX5VX2xhbmRzY2FwZSpVX2xvY2FsKSxtZXRob2Q9InBhaXJ3aXNlIikgfD4gYXNfdGliYmxlKCkNCmxsX2NvbXANCmxsX2NvbXAgJT4lIGZpbHRlcihwLnZhbHVlIDwgMC4wOTkpICU+JSBrbml0cjo6a2FibGUoKQ0KDQpwcmVkc19saWdodCA8LSBlbW1lYW5zKG1vZEFfbGlnaHQsIHNwZWNzPX5VX2xhbmRzY2FwZSpVX2xvY2FsLCBtZXRob2Q9InJlc3BvbnNlIikgfD4gYXNfdGliYmxlKCkNCnByZWRzX2xpZ2h0DQoNCmdfbGlnaHQ8LWdncGxvdCgpICsNCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBwcmVkc19saWdodCwgYWVzKHggPSBVX2xhbmRzY2FwZSwgeT1lbW1lYW4sIHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMLCBmaWxsPVVfbG9jYWwpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpLCBzaXplID0gMSwgcGNoID0gMjEpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9dXJiLmNvbDMsIG5hbWU9InVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsb2NhbCBzY2FsZSIpKw0KICBsYWJzKHggPSAidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSIsIHkgPSAicmVmbGVjdGFuY2UgKCUpIiApKw0KICB5bGltKDE2LDI4KSsNCiAgZ2d0aXRsZSgic3BpZGVyIGxlYWZsaWdodCByZWZsZWN0YW5jZSAoZnVsbCBkYXRhc2V0KSIpKw0KICB0aGVtZV9idygpDQpnX2xpZ2h0DQpgYGANCg0KIyMjIyBzdGF0aXN0aWNzIC0gZmlsdGVyZWQgbGVhZmxpZ2h0DQpgYGB7ciBzdGF0X2xlYWZsaWdodF9maWx0fQ0KI2RhdGFzZXQgOiBkYXRhX2NvbF9maWx0DQpwbG90KGRhdGFfY29sX2ZpbHQkY29sX2NvcnJfbGVhZmxpZ2h0fmRhdGFfY29sX2ZpbHQkbG9jYXRpb24pICAjIyBiaWcgcmFuZ2Ugb2YgdmFsdWVzDQptb2RBX2xpZ2h0X2ZpbHQgPC0gZ2xtbVRNQihjb2xfY29ycl9sZWFmbGlnaHQgfiBVX2xhbmRzY2FwZSpVX2xvY2FsKygxfHBsb3RpZC9sb2NhdGlvbiksIGRhdGE9ZGF0YV9jb2xfZmlsdCwgZmFtaWx5PWdhdXNzaWFuKSANCnN1bW1hcnkobW9kQV9saWdodF9maWx0KQ0KQW5vdmEobW9kQV9saWdodF9maWx0LCB0eXBlPSIzIikgIA0KcGxvdChzaW11bGF0ZVJlc2lkdWFscyhtb2RBX2xpZ2h0X2ZpbHQpKQ0KDQpsbF9maWx0X2NvbXA8LWNvbnRyYXN0KGVtbWVhbnMobW9kQV9saWdodF9maWx0LCBzcGVjcz1+VV9sYW5kc2NhcGUqVV9sb2NhbCksbWV0aG9kPSJwYWlyd2lzZSIpIHw+IGFzX3RpYmJsZSgpDQpsbF9maWx0X2NvbXANCmxsX2ZpbHRfY29tcCAlPiUgZmlsdGVyKHAudmFsdWUgPCAwLjA5OSkgJT4lIGtuaXRyOjprYWJsZSgpDQoNCnByZWRzX2xpZ2h0X2ZpbHQgPC0gZW1tZWFucyhtb2RBX2xpZ2h0X2ZpbHQsIHNwZWNzPX5VX2xhbmRzY2FwZSpVX2xvY2FsLCBtZXRob2Q9InJlc3BvbnNlIikgfD4gYXNfdGliYmxlKCkNCnByZWRzX2xpZ2h0X2ZpbHQNCg0KZ19saWdodF9maWx0PC1nZ3Bsb3QoKSArDQogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gcHJlZHNfbGlnaHRfZmlsdCwgYWVzKHggPSBVX2xhbmRzY2FwZSwgeT1lbW1lYW4sIHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMLCBmaWxsPVVfbG9jYWwpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpLCBzaXplID0gMSwgcGNoID0gMjEpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9dXJiLmNvbDMsIG5hbWU9InVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsb2NhbCBzY2FsZSIpKw0KICBsYWJzKHggPSAidXJiYW5pc2F0aW9uIGxldmVsIGF0IGxhbmRzY2FwZSBzY2FsZSIsIHkgPSJyZWZsZWN0YW5jZSAoJSkiKSsNCiAgeWxpbSgxNiwyOCkrDQogIGdndGl0bGUoInNwaWRlciBsZWFmbGlnaHQgcmVmbGVjdGFuY2UgKGZpbHRlcmVkIGRhdGEpIikrICANCiAgdGhlbWVfYncoKQ0KYGBgDQoNCg0KYGBge3IgY29tYl9yZXN1bHRfc3RhdF9sZWFmbGlnaHR9DQpnZ2FycmFuZ2UoZ19saWdodCwgZ19saWdodF9maWx0LCBuY29sPTIsIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQ9ImJvdHRvbSIpDQpgYGANCioqcmVzdWx0Kio6IHRyZW5kcyB2aXN1YWx5IHRoZSBzYW1lIChzb21lIGNoYW5nZSBmb3IgbWVkaXVtIGxhbmRzY2FwZXMpDQoNCg0KIyMjI3N0YXRpc3RpY3MgbGVhZmRhcmsNCmBgYHtyIHN0YXRfbGVhZmRhcmt9DQojIyMgbGVhZmRhcmsgKHBvaW50IG1lYXN1cmVtZW50KQ0KI2RhdGFzZXQgOiBkYXRhX2NvbA0KcGxvdChkYXRhX2NvbCRjb2xfY29ycl9sZWFmZGFya35kYXRhX2NvbCRsb2NhdGlvbikgICMjIGJpZyByYW5nZSBvZiB2YWx1ZXMNCm1vZEFfZGFyayA8LSBnbG1tVE1CKGNvbF9jb3JyX2xlYWZkYXJrIH4gVV9sYW5kc2NhcGUqVV9sb2NhbCsoMXxwbG90aWQvbG9jYXRpb24pLCBkYXRhPWRhdGFfY29sLCBmYW1pbHk9Z2F1c3NpYW4pIA0Kc3VtbWFyeShtb2RBX2RhcmspDQpBbm92YShtb2RBX2RhcmssIHR5cGU9IjMiKSAgIyBpbnRlcmFjdGlvbiBtYXJnaW5hbGx5IHNpZ25pZmljYW50DQpwbG90KHNpbXVsYXRlUmVzaWR1YWxzKG1vZEFfZGFyaykpDQoNCmxkX2NvbXA8LWNvbnRyYXN0KGVtbWVhbnMobW9kQV9kYXJrLCBzcGVjcz1+VV9sYW5kc2NhcGUqVV9sb2NhbCksbWV0aG9kPSJwYWlyd2lzZSIpIHw+IGFzX3RpYmJsZSgpDQpsZF9jb21wDQpsZF9jb21wICU+JSBmaWx0ZXIocC52YWx1ZSA8IDAuMDk5KSAlPiUga25pdHI6OmthYmxlKCkNCg0KcHJlZHNfZGFyayA8LSBlbW1lYW5zKG1vZEFfZGFyaywgc3BlY3M9flVfbGFuZHNjYXBlKlVfbG9jYWwsIG1ldGhvZD0icmVzcG9uc2UiKSB8PiBhc190aWJibGUoKQ0KcHJlZHNfZGFyaw0KDQpnX2Rhcms8LWdncGxvdCgpICsNCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBwcmVkc19kYXJrLCBhZXMoeCA9IFVfbGFuZHNjYXBlLCB5PWVtbWVhbiwgeW1pbiA9IGxvd2VyLkNMLCB5bWF4ID0gdXBwZXIuQ0wsIGZpbGw9VV9sb2NhbCksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSksIHNpemUgPSAxLCBwY2ggPSAyMSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz11cmIuY29sMywgbmFtZT0idXJiYW5zaXRpb24gYXQgbG9jYWwgc2NhbGUiKSsNCiAgbGFicyh4ID0gInVyYmFuaXNhdGlvbiBsZXZlbCBhdCBsYW5kc2NhcGUgc2NhbGUiLCB5ID0gInJlZmxlY3RhbmNlKCUpIiApKw0KICB5bGltKDEyLDE4KSsNCiAgZ2d0aXRsZSgic3BpZGVyIGxlYWZkYXJrIHJlZmxlY3RhbmNlIChmdWxsIGRhdGFzZXQpIikrICAgDQogIHRoZW1lX2J3KCkNCmBgYA0KYXNzdW1wdGlvbnMgb2YgdGhlIHN0YXRpc3RpY3Mgbm90IG9rDQoNCiMjIyNzdGF0aXN0aWNrcyAtIGZpbHRlcmVkIGxlYWZkYXJrDQpgYGB7ciBzdGF0X2xlYWZkYXJrX2ZpbHR9DQojZGF0YXNldCA6IGRhdGFfY29sX2ZpbHQNCnBsb3QoZGF0YV9jb2xfZmlsdCRjb2xfY29ycl9sZWFmZGFya35kYXRhX2NvbF9maWx0JGxvY2F0aW9uKSAgIyMgYmlnIHJhbmdlIG9mIHZhbHVlcw0KbW9kQV9kYXJrX2ZpbHQgPC0gZ2xtbVRNQihjb2xfY29ycl9sZWFmZGFyayB+IFVfbGFuZHNjYXBlKlVfbG9jYWwrKDF8cGxvdGlkL2xvY2F0aW9uKSwgZGF0YT1kYXRhX2NvbF9maWx0LCBmYW1pbHk9Z2F1c3NpYW4pIA0Kc3VtbWFyeShtb2RBX2RhcmtfZmlsdCkNCkFub3ZhKG1vZEFfZGFya19maWx0LCB0eXBlPSIzIikgICNpbnRlcmFjdGlvbiBzaWduaWZpY2FudA0KcGxvdChzaW11bGF0ZVJlc2lkdWFscyhtb2RBX2RhcmtfZmlsdCkpDQoNCmxkX2ZpbHRfY29tcDwtY29udHJhc3QoZW1tZWFucyhtb2RBX2RhcmtfZmlsdCwgc3BlY3M9flVfbGFuZHNjYXBlKlVfbG9jYWwpLG1ldGhvZD0icGFpcndpc2UiKSB8PiBhc190aWJibGUoKQ0KbGRfZmlsdF9jb21wDQpsZF9maWx0X2NvbXAgJT4lIGZpbHRlcihwLnZhbHVlIDwgMC4wOTkpICU+JSBrbml0cjo6a2FibGUoKQ0KDQpwcmVkc19kYXJrX2ZpbHQgPC0gZW1tZWFucyhtb2RBX2RhcmtfZmlsdCwgc3BlY3M9flVfbGFuZHNjYXBlKlVfbG9jYWwsIG1ldGhvZD0icmVzcG9uc2UiKSB8PiBhc190aWJibGUoKQ0KcHJlZHNfZGFya19maWx0DQoNCmdfZGFya19maWx0PC1nZ3Bsb3QoKSArDQogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gcHJlZHNfZGFya19maWx0LCBhZXMoeCA9IFVfbGFuZHNjYXBlLCB5PWVtbWVhbiwgeW1pbiA9IGxvd2VyLkNMLCB5bWF4ID0gdXBwZXIuQ0wsIGZpbGw9VV9sb2NhbCksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSksIHNpemUgPSAxLCBwY2ggPSAyMSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz11cmIuY29sMywgbmFtZT0idXJiYW5pc2F0aW9uIGxldmVsIGF0IGxvY2FsIHNjYWxlIikrDQogIGxhYnMoeCA9ICJ1cmJhbmlzYXRpb24gbGV2ZWwgYXQgbGFuZHNjYXBlIHNjYWxlIiwgeSA9InJlZmxlY3RhbmNlICglKSIpKw0KICB5bGltKDEyLDE4KSsNCiAgZ2d0aXRsZSgic3BpZGVyIGxlYWZkYXJrIHJlZmxlY3RhbmNlIChmaWx0ZXJlZCBkYXRhc2V0IikrICANCiAgdGhlbWVfYncoKQ0KYGBgDQoNCmNvbWJpbmF0aW9uIG9mIHRoZSByZXN1bHRzDQpgYGB7ciBjb21iX3Jlc3VsdF9zdGF0X2xlYWZkYXJrfQ0KZ2dhcnJhbmdlKGdfbGlnaHQsIGdfbGlnaHRfZmlsdCwgbmNvbD0yLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kPSJib3R0b20iKQ0KYGBgDQoqKnJlc3VsdCoqOiB0cmVuZHMgdmlzdWFseSB0aGUgc2FtZSAoc29tZSBjaGFuZ2UgZm9yIG1lZGl1bSBsYW5kc2NhcGVzKQ0KdXNpbmcgdGhlIGZpbHRlcmQgZGF0YXNldCA6IGRhdGFfY29sX2ZpbHQgKHNlZW4gb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGdyYXBoKToNCkhJR0ggTE9XIC0gSElHSCBNRURJVU0gICAgICAgLTEuNzc2NyAwLjUzMiAxMzI1ICAtMy4zMzcgIDAuMDI0NQ0KDQp3aXRoIGRhdGFfY29sIDoNCkhJR0ggTE9XIC0gSElHSCBNRURJVU0gICAgICAtMS42NzM5MjcgMC41NzkgMTM2NyAgLTIuODkwICAwLjA5MjEgKG1hcmdpbmFseSBzaWduaWYpDQppbiB0aGUgbW9kZWwgaW50ZXJhY3Rpb24gd2FzIG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQgYXMgd2VsbA0KDQpXaGVuIGV4cGxvcmluZyBsZWFmbGlnaHQgYW5kIGxlYWZkYXJrIGluIHJvdWdobHkgdGhlIHNhbWUgdHJlbmRzIGFzIGZvciBhYmRvbWVuIGJyaWdodG5lc3MgIA0KDQoNCg0KI25vdCBuZWNlc3NhcnkgZm9yIHJlcG9ydA0KDQojI3F1ZXN0aW9ucyBhYm91dCBzdGF0aXN0aWNhbCB0ZXN0cyANCg0KKipycHRSIGFuZCBsbWU0KiogDQoNCioqcXVlc3Rpb24qKjogbm90IGNvbXBsZXRlbHkgY2xlYXIgaG93IHRvIHVzZSBycHRSIGZvciBvdXIgZGF0YXNldCANCg0KZm91bmQgaW4gbGl0ZXJhdHVyZToNCg0KaHR0cHM6Ly9vbmxpbmVsaWJyYXJ5LndpbGV5LmNvbS9kb2kvMTAuMTExMS9qLjE0NjktMTg1WC4yMDEwLjAwMTQxLngNCkFkanVzdGVkIHJlcGVhdGFiaWxpdHkgY29udHJvbGxpbmcgZm9yIGZpeGVkIGVmZmVjdHMgKFVfbGFuZHNjYXBlIGFuZCBVX2xvY2FsKSwNCndhcyB0aGVuIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIHJwdFIgcGFja2FnZSBpbiBSIChOYWthZ2F3YSAmIFNjaGllbHpldGgsIDIwMTM7IFN0b2ZmZWwgZXQgYWwuLCAyMDE3KS4NCmVzdGltYXRpbmcgcmVwZWF0YWJpbGl0eSAoaW50cmEtY2xhc3MgY29ycmVsYXRpb24pIGFuZCBjb25maWRlbmNlIGludGVydmFscyAoQy5JKSBmcm9tIEdhdXNzaWFuIGRhdGEgKFN0b2ZmZWwgZXQgYWwuIDIwMTcpDQpVbmFkanVzdGVkIHJlcGVhdGFiaWxpdHkgbWVhc3VyZXMgdGhlIGJldHdlZW4taW5kaXZpZHVhbCB2YXJpYXRpb24gaW4gYSBnaXZlbiAuLi5yZXNwb25zZSB2YXJpYWJsZS4uLi4uLiwgd2hpbGUgYWRqdXN0ZWQgcmVwZWF0YWJpbGl0eSBjb250cm9scyBmb3IgZml4ZWQgZWZmZWN0cyB0aGF0IGNvdWxkIGluZmx1ZW5jZSAuLi4ucmVzcG9uc2UgdmFyaWFibGUuLi4uLiwgZWl0aGVyIGJlY2F1c2UgdGhleSBleHBsYWluIGJldHdlZW4gb3Igd2l0aGluIGluZGl2aWR1YWwgY29tcG9uZW50cyBvZiB2YXJpYXRpb24uIEZvciBib3RoIGFkanVzdGVkIGFuZCB1bmFkanVzdGVkIHJlcGVhdGFiaWxpdHksIHdlIGluY2x1ZGVkIC4uLi5sb2NhdGlvbi4uLi4gYXMgYSByYW5kb20gZWZmZWN0DQppbmZvIDogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3JwdFIvdmlnbmV0dGVzL3JwdFIuaHRtbCANCg0KSSBoYXZlIHNldCB0aGlzIGNvZGUgY2h1bmsgYXMgZXZhbD1GQUxTRSBzbyB0aGV5IHdpbGwgbm90IGJlIGV2YWx1YXRlZCBvbiBrbml0DQpgYGB7ciBycHRSLCBldmFsPUZBTFNFfQ0KbGlicmFyeShycHRSKQ0KcjEgPC0gcnB0KGNvbF9jb3JyX2FiZGJyaSB+IFVfbGFuZHNjYXBlICsgVV9sb2NhbCArICgxfHBsb3RpZCkgKygxfGxvY2F0aW9uKSwgZ3JuYW1lPWMoInBsb3RpZCIsICJsb2NhdGlvbiIpLCBkYXRhPWRhdGFfY29sX2ZpbHQsIGRhdGF0eXBlPSJHYXVzc2lhbiIsIG5ib290PTEwMDAsIGFkanVzdGVkPUYpDQpyMQ0Kc3VtbWFyeShyMSkNCnN1bW1hcnkocjEkbW9kKQ0KcGxvdChyMSwgY2V4Lm1haW49MSkNCg0KcjFiIDwtIHJwdChjb2xfY29ycl9hYmRicmkgfiBVX2xhbmRzY2FwZSArIFVfbG9jYWwgKyAoMXxwbG90aWQpICsgKDF8bG9jYXRpb24pLCBncm5hbWU9YygicGxvdGlkIiwgImxvY2F0aW9uIiksIGRhdGE9ZGF0YV9jb2xfZmlsdCwgZGF0YXR5cGU9IkdhdXNzaWFuIiwgbmJvb3Q9MTAwMCwgYWRqdXN0ZWQ9VCkgICAjI2dpdmVzIHNhbWUgb3V0cHV0IGFzIHRoZSB1bmFkanVzdGVkDQoNCnJwdEdhdXNzaWFuKGNvbF9jb3JyX2FiZGJyaSB+IFVfbGFuZHNjYXBlICsgVV9sb2NhbCArICgxfHBsb3RpZCkgKyAoMXxsb2NhdGlvbiksIGdybmFtZSA9IGMoInBsb3RpZCIsICJsb2NhdGlvbiIsIkZpeGVkIiwgIlJlc2lkdWFsIiksIGRhdGE9ZGF0YV9jb2xfZmlsdCwgYWRqdXN0ZWQ9RikgICMjIGhpZ2ggcmVzaWR1YWwgUiANCiMjYWRqdXN0ZWQgOiBCb29sZWFuIHRvIGV4cHJlc3MgaWYgYWRqdXN0ZWQgb3IgdW5hZGp1c3RlZCByZXBlYXRhYmlsaXRpZXMgc2hvdWxkIGJlIGVzdGltYXRlZC4gSWYgVFJVRSAodGhlIGRlZmF1bHQpLCB0aGUgdmFyaWFuY2VzIGV4cGxhaW5lZCBieSBmaXhlZCBlZmZlY3RzIChpZiBhbnkpIHdpbGwgbm90IGJlIHBhcnQgb2YgdGhlIGRlbm9taW5hdG9yLCBpLmUuIHJlcGVhdGFiaWxpdGllcyBhcmUgY2FsY3VsYXRlZCBhZnRlciBjb250cm9sbGluZyBmb3IgdmFyaWF0aW9uIGR1ZSB0byBjb3ZhcmlhdGVzLiBJZiBGQUxTRSwgdGhlIHZhcmlhbmNlZCBleHBsYWluZWQgYnkgZml4ZWQgZWZmZWN0cyAoaWYgYW55KSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkZW5vbWluYXRvci4NCiMjUmVzaWR1YWwgOiBpbiBjYXNlIG9mIGdhdXNzaWFuIHRoZSBPdmVyZGlzcGVyc2lvbiB3aWxsIGdpdmUgeW91IHNhbWUgdmFsdWUgYXMgdGhlIFJlc2lkdWFsICBzbyB3aGVuIHVzaW5nIGdhdXNzaWFuIHByZXN1bWVkIGRhdGEgb25seSB1c2UgUmVzaWR1YWwgDQoNCnIyPC1ycHRHYXVzc2lhbihjb2xfY29ycl9hYmRicmkgfiAoMXxwbG90aWQpICsgKDF8bG9jYXRpb24pLCBncm5hbWUgPSBjKCJwbG90aWQiLCJsb2NhdGlvbiIpLCBkYXRhPWRhdGFfY29sX2ZpbHQsIGFkanVzdGVkPUYpDQpyMg0Kc3VtbWFyeShyMikNCnN1bW1hcnkocjIkbW9kKQ0KcGxvdChyMiwgY2V4Lm1haW49MSkNCg0KcjMgPC0gcnB0KGNvbF9jb3JyX2FiZGJyaSB+IFVfbGFuZHNjYXBlICsgVV9sb2NhbCArICgxfHBsb3RpZCkgKyAoMXxsb2NhdGlvbiksIGdybmFtZSA9IGMoInBsb3RpZCIsICJsb2NhdGlvbiIsICJGaXhlZCIsIlJlc2lkdWFsIiksIGRhdGEgPSBkYXRhX2NvbCwgZGF0YXR5cGUgPSAiR2F1c3NpYW4iLCBhZGp1c3RlZCA9IEZBTFNFKQ0KcjMNCnN1bW1hcnkocjMkbW9kKQ0KcGxvdChyMywgY2V4Lm1haW49MSkNCnBsb3QocjMsIGdybmFtZSA9ICJGaXhlZCIsIHR5cGUgPSAiYm9vdCIpDQpgYGANCg0KKipyZW1hcmsqKiBsbWU0IGdpdmVzIGRpZmZlcmVudCBvdXRwdXQsIGJlY2F1c2UgaXMgYmFzZWQgb24gUkVNTA0KUkVNTCBuZWNlc3NhcnkgZm9yIHNtYWxsIHNhbXBsZSBzaXplcw0KZm9yIG1vZGVsIGNvbXBhcmlzb25zIE1MIGlzIG5lZWRlZC4NCmZvciBub3cgSSB1c2VkIHRoZSBNTCBtZXRob2QNCg0KSSBoYXZlIHNldCB0aGVzZSBjaHVua3MgYXMgZXZhbD1GQUxTRSBzbyB0aGV5IHdpbGwgbm90IGJlIGV2YWx1YXRlZCBvbiBrbml0DQpgYGB7ciBsbWU0LCBldmFsPUZBTFNFfQ0KbGlicmFyeShsbWU0KQ0KbWl4ZWQubG1lcl9SRU1MPC0gbG1lcihzcGlkZXJfbGVuZ3RoIH4gVV9sYW5kc2NhcGUgKyBVX2xvY2FsICsgKDF8cGxvdGlkL1VfbG9jYWwpLCBkYXRhPWRhdGFfYnopDQptb2RCX1JFTUwgPC0gZ2xtbVRNQihzcGlkZXJfbGVuZ3RoIH4gVV9sYW5kc2NhcGUrVV9sb2NhbCsoMXxwbG90aWQvVV9sb2NhbCksIGRhdGE9ZGF0YV9ieiwgZmFtaWx5PWdhdXNzaWFuLCBSRU1MPVQpICN3aXRob3V0IA0KY2FyOjpBbm92YShtaXhlZC5sbWVyX1JFTUwsIHR5cGU9MykNCmNhcjo6QW5vdmEobW9kQl9SRU1MLCB0eXBlPTMpDQoNCm1peGVkLmxtZXJfTUw8LSBsbWVyKHNwaWRlcl9sZW5ndGggfiBVX2xhbmRzY2FwZSArIFVfbG9jYWwgKyAoMXxwbG90aWQvVV9sb2NhbCksIGRhdGE9ZGF0YV9ieiwgUkVNTD1GKQ0KbW9kQl9NTCA8LSBnbG1tVE1CKHNwaWRlcl9sZW5ndGggfiBVX2xhbmRzY2FwZStVX2xvY2FsKygxfHBsb3RpZC9VX2xvY2FsKSwgZGF0YT1kYXRhX2J6LCBmYW1pbHk9Z2F1c3NpYW4pIA0KY2FyOjpBbm92YShtaXhlZC5sbWVyX01MLCB0eXBlPTMpDQpjYXI6OkFub3ZhKG1vZEJfTUwsIHR5cGU9MykNCmBgYA0KDQoqKmhvd2V2ZXIgdGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSB3aGVuIGFza2luZyBlbW1lYW5zIGlzIGRpZmZlcmVudCoqDQprZW53YXJkLXJvZ2VyIGFwcHJveGltYXRpb24gb25seSBhcHBsaWVkIHRvIFJFTUwgbW9kZWxzDQpTYXR0ZXJ0aHdhaXRlIGFwcHJveGltYXRpb24gY2FuIGJlIGFwcGxpZWQgdG8gTUwgYW5kIFJFTUwgbW9kZWxzDQoNCkkgaGF2ZSBzZXQgdGhlc2UgY2h1bmtzIGFzIGV2YWw9RkFMU0Ugc28gdGhleSB3aWxsIG5vdCBiZSBldmFsdWF0ZWQgb24ga25pdA0KYGBge3IgbG1lNF9nbG1tdG1iX2NvbXAsIGV2YWw9RkFMU0V9DQpjb250cmFzdChlbW1lYW5zKG1peGVkLmxtZXJfUkVNTCwgc3BlY3M9flVfbGFuZHNjYXBlLCBsbWVyLmRmPSJzYXR0ZXJ0aHdhaXRlIiksIG1ldGhvZD0icGFpcndpc2UiKQ0KY29udHJhc3QoZW1tZWFucyhtaXhlZC5sbWVyX1JFTUwsIHNwZWNzPX5VX2xhbmRzY2FwZSwgbG1lci5kZj0ia2Vud2FyZC1yb2dlciIpLCBtZXRob2Q9InBhaXJ3aXNlIikNCmNvbnRyYXN0KGVtbWVhbnMobW9kQl9SRU1MLCBzcGVjcz1+VV9sYW5kc2NhcGUpLCBtZXRob2Q9InBhaXJ3aXNlIikNCmBgYA0KDQpwZXJmb3JtYW5jZSBwYWNrYWdlIGlzIGRldmVsb3BlZCBmb3IgbW9kZWxzIHZpYSBsbWU0ICENCkkgaGF2ZSBzZXQgdGhlc2UgY2h1bmtzIGFzIGV2YWw9RkFMU0Ugc28gdGhleSB3aWxsIG5vdCBiZSBldmFsdWF0ZWQgb24ga25pdA0KYGBge3IgZXh0cmFfcGVyZm9ybWFuY2UsIGV2YWw9RkFMU0V9DQpsaWJyYXJ5KHBlcmZvcm1hbmNlKQ0KbGlicmFyeShxcXBsb3RyKQ0KIyMjZXh0cmENCiMjbW9kZWwgcGVyZm9ybWFuY2UNCm1vZGVsX3BlcmZvcm1hbmNlKG1vZEJfTUwpICANCnIyKG1vZEJfTUwpIyMgY29uZGl0aW9uYWwgUl4yIGlzIHRoZSBnb29kbmVzcyBvZiBmaXQgZm9yIHRoZSB3aG9sZSBtb2RlbCwgbWFyZ2luYWwgUl4yIGdvb2RuZXNzIG9mIGZpdCBvZiBvbmx5IGZpeGVkIGVmZmVjdHMgID0+IHJhbmRvbSBlZmZlY3RzIG5lZWRlZCA9PiBidXQgbG93IFJeMg0KY29tcGFyZV9wZXJmb3JtYW5jZShtb2RCX01MLCBtaXhlZC5sbWVyX01MKQ0KDQppY2MobWl4ZWQubG1lcl9NTCkNCkFJQyhtaXhlZC5sbWVyX01MKQ0KY2hlY2tfbW9kZWwobWl4ZWQubG1lcl9NTCkNCmBgYA==